最广泛的一种比喻是把区块链类比为账本,一个大帐本,每个区块就是一张账页,每个区块头部的父区块哈希值就像一根绳子把账页串起来,通过工作量证明选出有记账权的人来记账,用非对称的加密算法保证账页内容真实不可篡改,同时也保证了你的财产完完全全永久的属于你,只要互联网不消亡账本中的内容就不会消亡,不可磨灭这个特性倒是让有的人产生些有趣的创意,比如老猫在区块链里写进了“买入比特币就是做空全世界”这句话,你也可以在区块链上刻下你和爱人的誓言,这比刻到钻石戒指上还要“永流传”。
比特币是区块链的一种运用,那么具体区块链的生态环境下比特币是如何实现交易,这些交易又如何进入区块,最后成为区块链的呢?这就是今天想要说的。
一、比特币交易
比特币就是一个世界银行,它只有一种业务即转账,还是以我给你转一个比特币为例来说。
我要转账是要在钱包里操作的,我把我的比特币发送到你的地址,这个交易就生成了,接着钱包会把这笔交易向临近的节点广播,临近节点收到交易后开始验证这笔交易,交易被验证为合格后就会被放进当地的交易数据池中,被节点上的矿工搜集打包进入区块,然后该区块被该节点广播到其他临近节点,后续区块一一诞生,经过6个之后,你的钱包就会显示已到账(转账到账的快与慢取决于钱包里你对块深度的设置)。
我给你转的比特币经历这样一个过程就结束了它的旅程,所有权由我变为你。
上面是从一个旁观者的角度追随着一个比特币从一个地址到另一个地址,看到了它走过了哪些路线,怎样从一地到另一地,对它的流动有了一个整体的印象。
接着就要具体的说说细节,验证是怎样进行的?验证些什么内容,比特币的交易结构都长什么样?
1.首先要说的是比特币交易的是什么东西?不是比特币吗?是的我们是交易的比特币,但系统里实际上没有我们通常认为的那个比特币,比特币系统里只有UTXO。
比特币系统里没有账户、没有余额、没有密码,只有UTXO,它就是未被花费的交易输出(用比特币拥有者的公钥锁定的一个数字)
2.再说说,交易落实到代码上是如何验证的,先要弄明白交易结构,
交易结构就是一笔交易,包括输入和输出
输入==要被花费的UTXO+解锁脚本
输出==utxo(币值+锁定脚本)
解锁脚本:发送者私钥签名+发送者公钥
锁定脚本:
OP_DUP OP_HASH160<发送者公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
举例来帮助你理解UTXO和输入输出都是什么:
例:矿工A挖出12.5个比特币,就会生成一个UTXO,某天A向B购买服务需要支付2个比特币,
输入:UTXO(A公钥哈希+12.5)+解锁脚本
输出:UTXO(B的公钥哈希+2)
UTXO(A的公钥哈希+10.5) ------这个UTXO就是A的找零
这时系统会新生成两个UTXO ,一个是转给B的2个比特币,一个是找零给A的10.5个比特币,而原来的12.5个比特币的UTXO被删除。
关于输入输出开始我是犯迷糊搞不懂, 无法理解啥时候是输入啥时候是输出,如果以最通常的理解我转给你币当然你是收入了,我是输出了,但实际上那叫收入支出,这里的输入输出是站在比特币系统中UTXO的角度来说的,是对它从生到灭的这个过程而言的,当比特币(UTXO)要被花费的就是输入, 新生成UTXO的就是输出,这个输出也可以理解为诞生。
钱包里的余额是怎么回事?
我们现在手机端钱包或是网页钱包能看到余额,这是因为钱包就是一个程序,它把基于我的公钥锁定的UTXO进行统一整理,计算出一个数据显示出来,就好比比特币系统是一个藏宝库,钱包就是个大管家,当我点击查询余额时,就相当于给管家下了个命令,问他我在藏宝库里有多少宝贝,然后管家就和小伙计们在整个藏宝库里到处盘点,最后给我个清单,上面列出宝贝的种类和数量。
3.如何证明我转给你的币是属于我的,并证明我转的币没被花费过,这就是私钥要发挥作用的地方,这就是比特币系统在代码层面要做的事。
我转给你比特币这笔交易(交易结构)里必然要包含:基于我的公钥锁定的UTXO(锁定脚本),也就是我要花费的比特币,还有经我签名解锁并用你的公钥锁定的部分(解锁脚本),这两部分放在一起进行验证。上面这一段话可以用下面这个式子表示:
交易验证=对(运行解锁脚本+锁定脚本)的验证
二、交易的传播验证
其实节点验证交易时不只是对交易结构验证,还有很多条目的验证,主要内容有以下几项:
1、交易SIZE,不能超过区块的大小
2、交易输入的UTXO是存在的即我转给你的比特币是真实的
3、交易输入UTXO没被其他交易引用过(一笔钱没被花两次)
4、输入总金额>输出总金额(需要多留出续费)
5、解锁脚本验证(以栈的脚本语言把解锁脚本和锁定脚本放在一起验证这条交易是否合格)
到此,一项交易就被验证完成,除了放入本地交易数据池,还会被节点广播向其他节点传播。
三、区块的生成
矿工节点在本地的交易数据池中筛选出符合条件的交易,开始构建区块。
区块分为区块头部和区块身体,区块头部包含:版本号、父区块哈希值、MERKLE树根、时间戳、难度值、NONCE;区块身体由打包进来的交易构成。
四、区块的验证和链接
相邻节点收到区块后会检查这个区块是否合法,检查内容有以下项目:
1.验证POW的nonce值是否符合难度值,
2.检查时间戳是否小于当前时间2小时,
3.检查MERKLE树根是否正确,
4.检查区块SIZE要小于区块SIZE上限,
5.第一笔交易必须是coinbase交易(即挖矿产生),
6.验证每笔交易
经过以上验证,该区块内的交易全部真实,区块也真实有效后被广播出去,新的区块又以相同的方式做同样的工作,就这样一个个区块产生,并且链接在了一起,区块链就这样形成了。
区块链这个大帐本一页页的记录着,账本越来越厚, 区块们顺着时间的河向未来伸展。