比特币的基本环境安装,笔者使用vmware workstations+ubuntu16.04
首先安装ubuntu16.04操作系统。
安装完成后更新:
Ubuntu更新:(这一步有时候比较慢,耐心)
更新完成后安装bitcoin安装必要的软件包:
sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
sudo apt-get install libqrencode-dev
sudo apt-get install libminiupnpc-dev
Sudo apt-get install libevent-dev (这个有些教程没有写,但是编译时候会报错,建议早点安装上去)
打包完成后,选择一个目录下载源码:git clone https://github.com/bitcoin/bitcoin.git 如果发现命令不可用(apt-get install git 可以提前安装好 git很常用) 下载完成后下载Berkley DB 4.8
wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz'
tar -xzvf db-4.8.30.NC.tar.gz
cd db-4.8.30.NC/build_unix/
../dist/configure --enable-cxx --disable-shared --with-pic --prefix=/bitcoin/db4/
make install
Compile Bitcoin with Berkley DB 4.8
cd ~/bitcoin/
./autogen.sh
./configure LDFLAGS="-L/bitcoin/db4/lib/" CPPFLAGS="-I/bitcoin/db4/include/"
make -s -j5(这一步也很慢、耐心)
完成后:
Run Bitcoin Daemon/QT/Client
./src/bitcoind
./src/qt/bitcoin-qt
./src/bitcoin-cli
之前代码编译完成后,可以选择NetBeansIDE 或者VIM
这里用VIM:
首先下载依赖:
sudo apt-get install python vim exuberant-ctags git
sudo pip install dbgp pep8 flake8 pyflakes isort
下载vimrv:
Wget https://raw.githubusercontent.com/tao12345666333/vim/master/vimrc -O $HOME/.vimrc
打开安装插件:
vim -E -u $HOME/.vimrc +qall
vim编辑参考:https://github.com/tao12345666333/vim/blob/master/README-zh.md
比特币所有权:密钥+地址+数字签名
密钥独立现在存储于钱包(密钥以对的形式出现,公钥、私钥)、地址用于转移接收bitcoin、数字签名用于交易见证。(比特币交易过程中通讯和交易数据不加密)
助记词生成过程(BIP-39):
从熵源开始,增加校验、然后映射。过程:
创建128-256随机序列(熵)
提出SHA-256哈希前面几位(熵长/32),创建一个随机序列的校验和。
校验和添加到随机序列末尾。
序列划分11位不同部分。
11位部分值和2048个单字字典做对应。
生成单词即可
助记词生成种子:
PBKDF2(密钥延伸函数)熵用于导出512位种子,增加“盐”的概念,“盐”的目的一个增加暴力破解难度,另一面引入密码短语,保护种子的附加安全性。
接上述6步:PBKDF2密钥延伸函数的第一个参数来自生成的助记词,第二个参数为“盐”,由助记词和密码字符串连接而成,PBKDF2使用HMAC-SHA512算法,使用2048次hash来延伸助记词和盐参数,生成一个512位的值的输出,即为种子。
配置节点配置文件:
1.在.bitcoin/bitcoin.conf文件中设置用户和密码,rpcuser=用户名、rpcpassword=密码
2.alertnotify:电子邮件警报、conf:配置文件制定的命令和脚本、datadir:选择文件存储目录和文件系统(默认为.bitcoin目录)、prune:删除旧块、txindex:维护所有交易的索引、maxconnections:连接的最大节点数、maxmempool:内存限制、maxreceivebuffer:内存缓冲区限制(1000字节)倍数、minrelayfee:最低交易费用。
bitcoin脚本语言基于堆栈的语言:使用堆栈数据结构。
数字签名的工作模式:数字签名本质上是一种数学方案:一部分使用私钥在交易创建时创建签名,另一部分允许任何人来验证签名算法、公钥、给定的消息。数字签名通过ECDSA算法来实现,((Sig=F{sig}(F{hash}(m),dA))).dA签名私钥、m交易、F~hash~散列函数、F-sig~签名算法、Sig结果签名。
F~sig~:Sig=(R,S)通过计算R.S值,称为序列号的字节流。
交易锁定时间限制和检查锁定时间验证:交易锁定时间限制一笔交易的执行前提,必须在一定的时间和区块条件成熟后才能执行,一旦为到达前提则认为是无效交易。通过check lock time verify(CLTV)检查锁定时间验证来控制。CLTV在2015年12月bitcoin软分叉升级BIP-65规范提出,脚本语言中添加一种checklocktimeverify的操作符。CLTV是每个输出时间锁定,不是每个交易的时间锁定,区别于nlocktime:nlocktime是交易级时间锁定,CLTV是基于输出的时间锁。CLTV限制特定的UTXO,结合nlocktime设置为更大或者相等的值,约定未来的一个时间才能花费。脚本示例:DUP HASH160<交易者 PUBLIC KEY HASH>EQUALVERIFY CHECKSIG、CHECKLOCKTIMEVERIFY DROP DUP HASH160 <交易者 PUBLIC KEYHASH> EQUALVERIFY CHECKSIG .CLTV以一个参数作为输入,类同nlocktime格式数字,在后缀做一个bool的判断。
bitcoin采用P2P的网络架构。
网络发现:在bitcoin网络中加入一个节点,必须和其他节点互通,建立连接,一般采用8333端口和对等节点建立连接,过程如下:
nVersion定义客户端所发布的bitcoin的P2P协议版本。
nLocalServices一组该节点支持的本地服务列表。
nTime当前时间。
addrYou当前节点可见的远程节点的IP地址。
addrMe本地节点的本机IP地址。
Subver当前运行软件类型的子版本号。
BaseHeight当前节点区块高度。
版本消息是节点进入网络发送给对等节点的第一条消息,确认版本时候兼容,版本确认后发送一个verack建立连接。在寻找新的对等节点的时候,使用多个DNS种子来查询DNS,DNS服务器提供bitcoin的IP地址列表。Bitcoin core客户端包含五种不同的DNS种子名称,使用DNS种子选项由switch–dnsseed控制。
* 在连接上一个bitcoin节点的IP地址后:通过-seednode参数连接,仅用于为种子,nodea-version-nodeb、nodeb-verack-nodea、nodeb-version-nodea、nodea-verack-nodeb。当建立一个或者多个连接后,新节点将一个包含自身IP地址的addr发送给相邻节点,相邻节点依次传播其他相邻节点:nodea-addr-nodeb、nodea-getaddr-nodeb、nodeb-addr-nodea、nodeb-addr-nodea、nodeb-addr-nodea。节点连接到不同对等节点,节点主要作用:在失去已有连接时发现新节点,并在其他节点启动时提供相关信息,节点启动时候只需要一个连接,因为一个节点可以通过引荐方式到其他对等节点,不停重复该过程。当重启启动时候发现原先节点没有应答,那么可以通过使用种子节点重新启动。通过-connect=选项来指定一个或者多个IP地址。
* 全节点:全节点的意义就是包含全部交易信息的完整的区块链的节点,完整区块链节点包含完整的信息,独立进行建立或者校验区块链,包括从创世区块到最新区块,完整区块链节点可以独立校验交易信息,但完整区块链需要永久存储来保存数据和交易信息,故对本地硬件存储资源有一定要求。
* 库存清单:全节点接入网络,需要构建完整的区块链,那么数十万区块内容需要同步,在发送同步请求中包含一个bestheight字段标示当前区块的高度,对区块数量进行比较。然后交换一个getblocks消息,包含本地区块最顶端的hash值,通过比较验证本地的区块链时候最新。一旦不是最新区块那么需要补充,类似一种增量的概念,通过inv消息把hash值传播,缺少区块的节点通过getdata消息请求全区块信息。假设一个节点离线了一段时间,那么发送getblocks消息,收到inv响应,继而下载缺失区块。Nodea-getblocks-nodeb、nodeb-getblocks-nodea、nodeb-inv-nodea、nodea-getdata-nodeb、nodeb-block-nodea。
SPV节点工作原理:SPV节点只下载区块头,不下载区块中的交易信息,大小是完整的区块链数据的千分之一。SPV节点无法构建所有可用于消费的UTXO全貌,SPV节点在验证交易时通过依赖对等节点按需提供区块链的相关部分的局部视图。简化支付验证通过参考交易的深度来验证,在一个全节点会构建一个验证链,该链由沿着区块链按时间倒序一致追溯到创世区块的数千区块和交易组成,SPV节点验证区块的链,并把验证的链和交易相关联。SPV节点不能验证UTXO是否还未被支付,SPV节点在该交易信息和它所在区块之间用merkle路径建立链接,之后6个区块链堆叠在该交易区块之上,验证之后6个区块的有效性,保证交易正常。
SPV节点工作过程:SPV节点使用一条getheaders消息,而不是通过getblocks消息来获得区块头。响应节点发送一条headers的消息发送大量区块头,SPV节点同时在对等节点的连接上设置过滤器,用于过滤对等节点发来的区块和交易数据流,任何目标交易都是通过一个getdata的请求来读取,对等节点则生成一条包含交易信息的tx消息作为响应。过程:nodea-getheaders-nodeb、nodeb-headers-nodea、nodea-getheaders-nodeb、nodeb-headers-nodea。理论上来说SPV在需要读取特定交易而选择性的验证交易,存在一定的隐私风险,在对特定数据的请求可能投入钱包地址信息。
Bloom工作原理:实现通过一个可变长度N的二进制数组和可变数量M的一组hash函数组成,hash函数的输出值始终在1和N之间,该数值与二进制数组相对应,函数为一个确定性函数,理解为,任意一个使用bloom过滤器的节点通过该函数都能对特定输入得到同一个的结果,bloom过滤器的准确性和私密性能通过长度N和hash函数的数量M来调节。Bloom过滤器数组中每一个数的初始值为0,关键词被加到bloom过滤器中之前,依次通过每一个hash函数运算一次。通过hash函数运算后得到一个1到N之间的数,在数组中对应的位置被置为1,从而把hash函数的输出记录下来,接下来再进行下一个hash函数的运算,另一位置为1,不断重复该过程,当全部M个hash函数都运算后,一共有M个位置被置为1,这样一个关键词就被记录在bloom过滤器中。但增加第二个关键词重复之前的步骤。随着更多的关键词指向了重复的位,那么bloom过滤器随着位1的增加而饱和,准确性就相应的降低了。当将关键词逐一代入各hash函数中运算,结果和之前的原数组比较,那么所有结果都成了1,就表示这个关键词可能已经被该过滤器记录,当然这个结论是可能是的一个效果,因为这些字节的1也有可能是其他关键词运算的重叠结果。但验证一个关键词结果字段为0,那么就确定没有被匹配。
SPV节点中使用bloom过滤器:bloom过滤器用于过滤SPV节点从其对等体接收的交易,仅选择SPV节点感兴趣的交易,不泄露相关地址和密钥。SPV节点初始化将过滤器为空状态,SPV节点列出相关感兴趣的地址、密钥、散列,通过从其钱包控制的任何UTXO中提取公钥hash、脚本hash、交易ID来实现,SPV节点将其中的每一个都添加到bloom过滤器,如果这些模式存在于交易中,那么bloom过滤器则匹配,但不自动显示模式。此时,SPV节点将向对等节点发送一个过滤器加载消息,在对等节点上,针对每个传入交易检查bloom过滤器,全节点根据bloom过滤器检查交易的几个部分然后进行匹配。检查组件通过使用bloom过滤器来匹配公钥hash、脚本、OP_RETURN值、签名中的公钥或者智能合同复杂脚本的任何未来组件。建立过滤器后只有匹配交易才发送到节点,响应节点的getdata消息,对对等节点发送一个merkleblock消息,该消息仅仅包含过滤器匹配的块和每个匹配交易的merkle路径的块头,同时对等节点发送包含过滤器匹配的交易和tx消息。全节点向SPV节点发送交易,SPV节点丢弃任何误报,使用正确的匹配的交易更新UTXO集和钱包的余额,同时也修改bloom过滤器,然后全节点就可使用新的bloom过滤器来匹配性的交易。
交易池:在bitcoin中每个节点都会维护一份未确认交易的临时列表,称为内存池和交易池。节点利用这个临时的列表来追踪记录那些在网络上知晓,但为被打包进区块的交易。随着交易的接收,这些内容添加上交易池,并传播到网络中。当然有些节点还维护一个独立的交易池,一个交易的输入和一些未知交易相关,那么这个交易理解为孤立交易,暂时存储在孤立的交易池中,直到相关交易信息接收到。过程如下:一个交易添加到交易池,同时检查孤立交易池,查看是否有孤立交易引用了该交易的输出,任何相关交易进行验证,验证通过,那么孤立交易池中删除该交易,添加上交易池中,使得交易记录相关联,对于加入到交易池中的交易,不再是孤立交易,这个过程重复迭代,使得整个交易链连接起来,触发整个交易链重构。交易池和孤立交易池存储在本地内存中,注意是内存中不是存储在硬盘中,这些交易通过网络传入的消息动态填充,启动时候,交易池和孤立池都是空的,睡着新交易的接收慢慢填充。当然一般bitcoin客户端还会有一个UTXO数据库,这个之前文章有写到过,这称为UTXO池,这和交易池是两个不同的数据集合,UTXO池初始化不能为空,里面包含了数以百万级的未支付交易输出记录,这个永久性存储。最大一个区别点:UTXO池代表包含之前已确认的交易,交易池和孤立池是只包含为确认的交易。
bitcoin经济学:2009年bitcoin开始发行为50个bitcoin的奖励、2012年每个区块的奖励是25个bitcoin、2016年7月每个区块的奖励是12.5个bitcoin。在大致2020年区块高度630000时候会下降到6.25个bitcoin,32次等分后,大致在6720000区块高度会到极限1聪bitcoin,最终在6930000区块高度时候全部bitcoin发行完毕。总量固定且发行速度递减创造一种抗通常的供应模式。当然假设有人忘记了私钥,那么bitcoin总量事实上是在一直减少的。
通货紧缩:bitcoin的发行模式认为会导致货币通货紧缩,通缩是一种由于货币的供应和需求不匹配导致的货币增值的现象,和我们经常听到的通货膨胀相反,这就意味着货币随着时间有更强的购买力。
经济学家观点:通缩经济是一种需要避免的灾难型经济,在快速通缩期,意味着商品价格下跌,人们不可避免的会去储存货币,尽量不去花费掉。那么整个经济就因为在需求崩塌后导致了滞涨状态。
Bitcoin观点:法币、货币有可能会被无限制的印刷,除非遇到需求完全崩塌并且毫无发行货币的情况下,因此经济很难进入滞涨期,bitcoin的通缩是本身特性, 并不是需求崩塌引起,所以认为是一种预定且有节制的货币供应模型。
去中心化:在bitcoin网络中所有节点都接受区块链,区块链作为一本证明所有权的权威记录存在。去中心化的机制,使得所有节点达成共识,和传统的中心化认证机构权威认证的模式完全不同。在bitcoin中,所有的全节点都有一份完整的数据的副本,这个副本就认为是权威,权威是所有节点的认可,记账是通过独立竞争再广播认可,所以认为bitcoin是一种去中心化自发共识机制,没有中心节点、没有完成点。众多独立节点遵守规则异步交互自发形成。产生4种独立过程且有相互作用:
每一个全节点依据综合标准对每个交易进行独立验证。
工作量证明算法的验算,挖矿节点将交易记录独立打包到新的区块中。
每个节点独立对新区块进行校验,并完成区块的链接。
每个节点对区块链独立选择,在工作量证明机制下选择累计工作量最大的区块链。
交易独立验证:在钱包软件中,通过收集UTXO,提供正确的解锁脚本,新建一个支出给接收者来创建交易,随后交易广播到网络中。在节点收到交易的时候,首先验证该交易,检验正常则传播,检验不正常则在第一个节点就废弃。校验列表:
交易的语法和数据结构正确。
输出和输入列表不为空。
交易字节大小 输出的总量在2100万个(bitcoin的最大值)。
没有hash值为0,N等于-1的输出。
Nlocktime是小于或等于INT_MAX,或者nlocktime and nSequence的值满足Median TimePast。(Median Time是这个块的前面11个块按照block time排序后的中间时间)
交易字节大小是大于或等于100.
交易中签名数量小于签名操作数量上限。
解锁脚本只能将数字压入栈中,锁定脚本必须符合isStandard格式。
池中或者位于主分区区块中的一个匹配交易必须是存在的。
对于每一个输入,引用的输出必须存在,且没有被花费掉。
对于每一个输入,引用的输出存在于池中任何别的交易中则交易被拒绝。
对于每一个输入,主分支和交易池中寻找引用的输出交易,如检查缺少该输出交易中任何一个输出,该交易成为一个孤立交易,且其匹配的交易为出现在池中,那么加入到孤立交易池。
对于每一个输入,如果引用的输出交易是一个coinbase输出,那么该输入至少获得COINBASE_MATURITY(100)个确认。
使用引用的输出交易获得输入值,检查每一个输入值的总值是否在规定范围内,小于2100个bitcoin,大于0.
输入值的总和小于输出值的总和,交易中止。
交易费太低无法进入一个空区块,交易中止。
每一个输入的解锁脚本必须依据相应输出的锁定脚本验证。
以上交易验证在bitcoin客户端的AcceptToMemoryPool、CheckTransaction、CheckInputs函数中执行操作。
交易打包:在验证交易后,bitcoin节点会将这些交易添加到自己的内存池中(交易池),用来暂时存储未添加到区块的交易记录,验证这些交易,挖矿节点把这些交易整合到一个候选区块中。每一个挖矿节点维护本地的区块链数据副本,同时一直在网络上监听网络中的交易,本地区块高度和网络上区块高度对比,一旦收到信的高度的区块信息,那么就是下一个区块生成的竞争开始,在整个过程中,挖矿节点在计算新区块的数学难题的同事,也同时收集交易记录为再下一个区块做准备,这些交易存放在内存池,验证新区块产生后,检查区块中的交易同时移除自己内存池中在区块中生成的交易记录,剩余的等候在下一个区块生成。挖矿节点通过竞争机制,构建的区块是一个候选区块,只有在完成工作量证明解后,这个区块才生效。该命令索引区块信息:bitcoin-cli get blockhash 区块高度。
校验区块:区块生成后广播后,其余节点需要独立校验每个区块,当一个节点接收到一个新的区块,需要进行以下校验:
区块的数据结构语法有效。
区块头的hash值小于目标难度。确保足够的工作量证明。
区块时间戳早于验证时刻未来两个小时。
区块大小在长度限制之内。
第一个交易为coinbase交易。
验证区块内的交易确保他们的有效性。
矿池:现在bitcoin环境中,矿工算力竞争激烈,那么个体solo挖矿几乎没有什么机会,综合电力和硬件成本,solo挖矿意义着实不大,就算通过最快的ASIC也无法和巨大机房里数万芯片集成的矿产竞争。综合经济利益考虑加入矿池,通过专门的协议协调矿工。个人矿工在建立了矿池账号之后,设置自己的挖矿服务器连接到矿池服务器,矿工的挖矿设备在挖矿时保持和矿池服务器的连接,和其他矿工同步各自的工作,分享挖矿任务,分享奖励。当然每个区块被挖出来之后,bitcoin奖励是发送到矿池的bitcoin地址,当奖励到一定的阈值,矿池服务器定期支付奖励给参与的矿工。一般情况下,矿池服务器为提供矿池服务收取一个百分比的费用,参加的矿池的矿工把去挖掘区块的任务分割,根据其挖矿的贡献值来或者相应份额的分红,矿池赚取一个份额设置一个低难度的目标,通常难度低于1000倍以上。
当矿池中有人成功挖出一块,矿池获得奖励,并和所有矿工按照他们做出的贡献份额的比例分配。矿池中几乎每个参与矿工都能分得奖励,这就激励了每个人为矿池做出贡献,一般通过设置一个较低的取得份额的难度,矿池计算出每个矿工的工作量,每当矿工发现一个小于矿池难度的区块头hash,就证明已经完成了寻找结果所需的hash计算,同时为取得这份份额,能使用一个统计学上可衡量的方法,整体寻找一个bitcoin网络的目标散列值,众多矿工尝试较小区间的hash值,最终找到符合要求的结果。
P2P矿池:互联网上是一个活性群体,不排除作弊可能,故托管矿池也存在这样的一个问题,管理人可以利用矿池进行双重攻击导致区块无效,矿池也存在一个中心化的概念,一旦发生中心化矿池的故障,那么就意味着单点故障,拒绝服务或者服务器宕机,那么就直接影响到了矿工的采矿,2011年避免中心化矿池的问题,提出P2Pool矿池,这是一个点对点矿池,没有中心管理节点,P2Pool通过将矿池服务器的功能去中心化,实现一个矿池区块链的系统,这里称为份额链(sharechain)。一个份额链是一个难度低于bitcoin的区块链系统,份额链允许矿工在一个去中心化的池中合作,每30秒一个份额区块出块,并获得份额,份额链上的区块记录了贡献工作和矿工的份额,并且继承之前的区块份额记录,当一个份额区块上实现bitcoin网络的难度目标时,那么就被广播到bitcoin区块链上,奖励份额链中的矿工。简单理解,份额链就是一个记录矿工份额和奖励的区块链系统,通过类似bitcoin的去中心化共识机制来保存所有份额记录。P2Pool采矿方式比之前中心化矿池要复杂,至少需要矿工硬件,网络带宽能支持一个bitcoin完整节点和P2Pool节点软件。P2Pool矿工加入到份额链,通过类似solo的挖矿模式,但是在份额链上合作采矿。P2Pool是一种比solo有效的挖矿方式,同时也兼顾了托管矿池给于管理人太多的权利,一种众合的方案,一种多样化采矿生态系统,使得P2Pool整体比bitcoin更为强大。
共识机制:共识在区块链中来确定区块的和交易的有效性。保证网络中各个节点达成一致性的区块链副本,共识机制在一定时期内是不变的,但是互联网系统中,由于互联网的本性是一个共同参与活性系统,各个节点自制的特点,导致不确定性和未知性,故长期来看区块链的共识机制会发生一定的变化,变化是为了自适应,更好的迎合新功能、完善改进系统缺陷,以致更好的维护整个系统的正常运行。
硬分叉:在bitcoin系统中,我们现在听到最多的就是分叉,之前说到过bitcoin系统的短暂的分叉,在系统中一直存在,结合共识机制的变化,这时候区块链的分叉会出现一种硬分叉,硬分叉后,网络中区块链节点不会重新收敛到一个单独的链,分叉出来的两个子链接会各自发展,在bitcoin网络中一部分的节点不按照网络中其他节点的一致性新规则运行,这时候就产生了硬分叉。
硬分叉具体说明:官方定义:A permanent divergence in the the block chain, commonly occurs whennon-upgraded nodes can’t validate blocks created byupgraded nodes that follow newer consensus rules.(区块链发生永久性分歧,在新共识规则发布后,部分没有升级的节点无法验证已经升级的节点生产的区块,通常硬分叉就会发生。)简单理解,网络中节点可能故意、可能是错误故障导致共识机制规则发生了一些变化,硬分叉需要系统中所有参与者之间进行协商,没有升级到新的共识机制下的参与节点都不能参与共识机制,硬分叉那一个区块高度,会强制分叉到另一个单独的链上。硬分叉引起的变化认为是不向前兼容,没有升级的节点无法处理升级后的共识机制,区块链出现了两个分叉,在另外一条分叉的链上重新收敛,达成另一种先前共识的链。举例:新的共识机制一般是出现了新的客户端版本,一部分矿工运行新的共识机制生成区块,区块中使用新的数字签名包含的交易,那么未升级客户端版本的会认为新的数字签名的交易无效,在区块中不接受这类型的交易,如果有一定数量的矿工未升级客户端那么他们不接受升级客户端后的交易,故产生单独两条链。备注说明:硬分叉是软件引起的一种分叉,但是软件的升级本身不产生分叉,升级默认认为是所有节点都升级,使用新的共识机制,分叉的引起是矿工的竞争,矿工之间对共识的认同与否产生新的一条链。一般硬分叉四个阶段:软分叉、网络分叉、挖矿分叉、区块链分叉。
软分叉:官方定义:A temporary fork in the block chain which commonly occurs whenminers using non-upgraded nodes violate a new consensus rule their nodes don’t know about.(当新共识规则发布后,没有升级的节点会因为不知道新共识规则下,而生产不合法的区块,就会产生临时性分叉。)当然不是所有的共识机制都会导致硬分叉,那么只有前向不兼容的共识规则才会导致分叉,结合硬分叉和乱分叉,和我们传统软件的向下版本兼容有个不同的理解。共识机制的改变能按照先前的共识机制来处理交易和生成区块,那么理解为在不进行分叉的情况下实现共识机制的修改,这个称为软分叉,事实上有人理解为软分叉不是真正意义上的分叉,软分叉允许老版本的软件和新版本的规则共同工作。软分叉增加共识机制的约束,不是共识机制的扩展,故向前兼容,新的规则下的交易老的规则下同样有效,故软分叉不要求所有节点强制升级。