站在技术角度学习区块链(三) 比特币交易+区块生成

1. 未花费的交易输出(UTXO, Unspent Transaction Output)

  • UTXO就是一个用比特币拥有者的公钥锁定(加密)的一个数字
  • UTXO==比特币,实际的区块链中没有币的概念,都是UTXO
  • 比特币系统里没有账户,自然也没有余额等内容
  • UTXO存储在全节点的数据库里
  • 转账将消耗掉属于你的UTXO,同时生成新的UTXO。
  • 小知识:假设你有5个比特币,你给X转了2个比特币,然后结束操作,你会发现你的5个比特币都没有了,这是因为按照区块链的规则,矿工默认将剩余的3个比特币作为自己的工资。为了避免自己的损失,需要在给X转了2个比特币以后再给自己转3个比特币,采不会出现上述情况。当然,如果用别人封装好的客户端是不会出现这个问题的

2.交易的结构

  • 交易的输入:UTXO+解锁脚本(签名、发送者公钥)
  • 交易的输出:锁定的比特币数量+锁定脚本(接收者的公钥Hash)

3.交易的验证

交易的验证是基于栈的一种脚本语言,主要操作有OP_DUP、OP_EQUALVERIFY、OP_HASH160、OP_CHECKSIG、OP_ADD、OP_SUB、OP_MUL、OP_DIV。而操作表达式用的是逆波兰式

锁定脚本:OP_DUP OP_HASH160 <发送者的公钥的Hash> OP_EQUALVERIFY OP_CHECKSIG

解锁脚本:<发送者签名> <发送者公钥>

交易验证:运行解锁脚本+锁定脚本 => True

合法的交易必须满足如下条件:

  • 交易的size要小于区块size的上限
  • 交易输入UTXO是存在的
  • 交易输入的UTXO没有被其它交易引用,即没有被花费两次(Double Spending)
  • 输入总金额 > 输出总金额
  • 解锁脚本验证

4. 区块的生成

矿工在挖矿之前要先创建区块,区块内需要创建的内容包括:

  • 将coinbase交易打包进区块
  • 将交易池中高优先级的交易打包进区块,其中优先级=交易的额度*UTXO的深度/交易的size,这样做的一方面是考虑到“放粉尘攻击”,单次大批量的小额交易将被延后。
  • 创建区块的头部,头部包括:版本号、父区块Hash(如果父区块进行了任意修改,则Hash值将改变,从而串改将会被发现)、Root of Merkle Tree(所有具体交易信息存储在该树中)、时间戳、难度值、Nonce

5. 区块的传播

挖矿成功后将,将计算出来的随机数Nonce值填入头部,然后向周围广播,相邻区块收到广播以后立即进行如下验证:

  • 验证POW的Nonce值是否符合难度值
  • 检查时间戳是否小于等于当前时间2小时
  • 检查Merkle树根是否正确
  • 检查区块Size要小于区块Size要求的上限
  • 第一笔交易必须是Coinbase交易
  • 验证每笔交易

6.什么是Merkle Tree?

通常我们验证文件完整性的时候都是传输完文件以后再传输一个原文件的Hash值,然后计算文件的Hash与传输得到的Hash是否一致来判断传输的文件是否完整,但文件太大以后都是分块传输的,那么能否只通过小部分的文件块就能验证整个文件的完整性?答案是肯定的。

验证方法:

  • 将文件分块,然后通过各个块构造Markle Tree
  • 传输文件和文件对应Markle Tree上从叶子节点到根节点的补Hash串,计算得到根Hash串
  • 判断计算得到的根Hash串与原始根Hash串是否一致
  • 如果一致则说明数据准确,否则验证失败

站在技术角度学习区块链(三) 比特币交易+区块生成

详细内容参考:https://blog.****.net/pony_maggie/article/details/74538902