区块链概论(开发者入门篇( 三 )


我们来看看交易的输入与输出:

区块链概论(开发者入门篇

文章插图
tx的值是即是一笔UTXO的哈希 , 在例子中则是选择C转给我的2个比特币 , 将这些钱给C 。作为输入的交易可以是多个 。(比如我想转D3个比特币 。A与B的交易单个肯定不够)
输入脚本:也就是是转账人私钥生成的数字签名 , 即需要转账人证明自己有与公钥哈希对应的私钥 , 这样他才可以使用这笔UTXO 。下一行是转账人的公钥 。
Value就是转账的金额 。
:是输出脚本 , 其中包含了若干脚本命令 , 以及收款方的地址 。
现在我们来看脚本的执行过程 。
比特币的脚本基于堆栈 , 后进先出 。
交易1 :A转账给B
输入:A的签名&公钥
输出:B的公钥HASH
交易2:B转账给C
输入:B的签名&公钥
输出:C的公钥HASH
先执行交易2的输入脚本 , 从左向右 , 将签名与公钥入栈;然后执行交易1的输出脚本——复制栈顶元素 。
区块链概论(开发者入门篇

文章插图
然后计算栈顶元素的HASH , 也就是A的公钥HASH , 即A的比特币地址 。然后将交易1的输出中的地址(A的地址)压栈 。
区块链概论(开发者入门篇

文章插图
接下来判断栈顶前两个元素是否相等 。如果相等继续执行 , 如果不相等中断 。最后使用来进行签名校验 , 即公私钥匹配 。
区块链概论(开发者入门篇

文章插图
一串指令证明了想要花费该UTXO中比特币的人 , 是否有对应的私钥 , 也就是这笔转账是否是转给A的 , 或者是A是否有权限可以花 。
挖矿
然后我们有必要来看一下挖矿 。
先看一眼区块头部的数据结构 。
区块链概论(开发者入门篇

文章插图
其中树是对交易的散列树 。两两合并最终形成根节点 。来看一个更完整的图:
区块链概论(开发者入门篇

文章插图
我们常说挖矿就是寻找这个随机数Nonce , 其实在区块生成时的散列是固定的 , Nonce的值从0开始 。其中第一个交易是(挖矿交易) , 即挖矿交易会的输出地址是你的独一无二的地址 , 所以虽然区块生成时的散列是固定的 , 但每个区块的 tree根节点不同 , 所以对于每个矿工来说 , 被挖区块的散列是不同的 。
挖矿的目的就是改变这个Nonce的值 , 通常从0开始往上增加 。每改变一次Nonce , 我们就对区块重新计算HASH , 直到得出的HASH值满足区块头中的目标值 。这个目标值是一个标准 , 通常前n位为0 , 如果矿工计算出的HASH值小于等于该目标值 , 也就是至少前n位为0时 , 挖矿成功 。目标值也叫难度值 , 比特币规定十分钟挖出一个区块 , 若是快于或者慢于十分钟 , 目标值就会自动调整 , 使得挖矿更难或者更容易 。保证十分钟产出一个区块 。
当然区块中的交易 , 就是这10分钟内产生的交易 。如果交易太多(因为每个区块大小为1MB , 存储交易数量有限) , 则继续由下一个区块打包 。
找到这个随机数不容易 , 因为散列函数的性质决定了不能一下就猜到数字 , 只有一个一个试 , 因为通常从0开始一个一个往上加 , 所以说最后的Nonce值 , 就是矿工执行哈希散列的次数 。