区块链网络是一个分布式网络,网络中存在众多节点,每一个节点都参与数据维护。当有新的数据加入时,所有节点都会对数据进行验证,节点间必须对处理结果达成一致才能将新加入的数据成功写入各自维护的区块链中,目的是让网络中每个节点都拥有一套完全一致的数据记录。那么区块链是怎么工作的呢。接下来,以比特币的一笔交易为例来说明区块链是怎么工作的。
1身份验证
由于在区块链网络中没有中心机构对节点进行认证,所以首要解决的问题是对节点的身份验证。在比特币区块链系统中,通过一对密钥来完成验证。在创建比特币账户时,会生成公钥和私钥,私钥用于数字签名,确认交易所有权,公钥则是私钥通过算法生成的,并且是对外公开的,此过程不可逆,即无法通过公钥推出私钥。用公钥对数据进行加密后,只有对应的私钥才能解密,如果用私钥加密,则只有对应的公钥才能解密。在区块链系统中就是用这样一对唯一匹配的私钥和公钥来完成加密解密和身份验证。公私钥的验证过程如图1-1所示。
图1-1 公私钥验证过程
Alice向Bob发送消息“Hello Bob”,首先使用Bob提供的公钥对信息进行加密形成密文,Bob使用自己的私钥对密文进行解密,解密后的结果如果是“Hello Bob”,则证明这个消息是正确的。此外,还提供了签名机制,Alice可以用自己的私钥对消息进行签名,Bob通过Alice提供的公钥进行验签,从而证明这个消息的发送者是Alice。
2交易确认
当某个节点发起一笔交易时,交易不会立即添加到区块链中。首先会对交易余额进行校验,可是在区块结构中,并没有记录账户余额,那么怎么才能知道交易方有足够的余额呢。在比特币交易网络中,货币的所有权是通过验证历史交易信息来核实的。
例如Alice要发送1个btc给Bob,Alice必须援引之前收到这1个或更多的比特币的历史交易信息,这些被援引的交易记录称作“进账”,Bob会查看那些进账,以确保Alice是真正的接收者,并确保进账数额为1个btc或更多。一旦一笔交易被使用过一次,该笔交易会被认为是已消费,且不能被再次使用。
3交易记录
如果Alice的账户通过验证则该笔交易为合法交易,Bob会将交易信息保存在事务池(或内存池)中并广播给其它节点,其它节点接收到交易信息后也进行同样的校验操作。当某一个节点获得记账权后(基于加密哈希进行的随机猜测),它会将交易纳入区块,在区块上加盖时间戳并记录到自己维护的区块链中,然后将该区块进全网广播,其它节点接到广播后,也将区块记录到各自维护的区块链中,此时Alice给Bob的转账完成,交易信息被记录到区块链上,无法更改。需要注意的是,我们所说的全网广播,实际上只要大部节点能收到就可以了。区块链提供了系统的容错能力,那些没有收到的节点可以通过下载的方式获取到缺失的区块。
4双重支付和分叉
Alice账户有1个未消费的btc,Alice将这个1个btc同时发送给了Bob和Tom,这被称为“双重支付”或“双花”。如果两笔交易被先后验证,例如给Bob的交易通过验证,那么给Tom的交易就会验证失败,反之亦然,验证失败的交易会被丢弃。如果两笔交易被同时验证,都被认为是有效交易,那么在接入区块链时就会暂时出现分叉情况,如图1-2所示。
图1-2 区块链分叉
之后的区块如果认同哪一个区块就会在哪一个区块后面延续,比特币规定选择最长的那条链进行扩展,所以当再有新的区块加入时会沿着最长的链延续,较短的那条链上的区块将被抛弃,对应的交易将失效,失效的交易将承担相应的损失。
为了避免这种情况发生,需要等待之后至少6个区块都承认此区块后,再确认交易完成,主要是因为,如果经过6次确认之后再返回去修改之前已经被确认过的区块,则必须推翻之前6个区块的记录,这其实是很难的。因为获得确认数越多,就需要越多的算力去修改,因此也越难被修改,除非拥有全网51%以上的算力,否则这是不可能实现的。这也是比特币区块链交易形成的“等待六次确认”原则。