区块链基础概念–比特币运行机制

基于《区块链-技术驱动金融》一书


比特币交易:


  • 地址转换:一个交易中输出的币,要么在另一个交易中被完全消费掉,要么就一个都不被消费。所以需要自身将剩余的币转给自己所有的另一个地址

  • 有效验证: 从所引用的交易开始验证到最新一次的交易,而不需要从头开始

  • 资金合并: 发起一个交易,交易里有两个输入和一个输出,输出的地址是自己的地址

  • 共同支付:交易中同样包含两个输入和一个输出,两个输入的hash指针不同,因此这笔交易需要支付者两人的签名

1


  • ScriptSig(输入脚本): 指定了对应公钥的签名
  • ScriptPubkey(输出脚本): 指定了公钥或是公钥哈希值的地址

交易输出: 凭借哈希值为X的公钥,以及这个公钥所有者签名,才可以获得这笔资金。

判断一个交易是否有效,需要我们把输入、输出脚本串联起来形成串联脚本:

2

比特币的脚本语言不是图灵完备的,而是堆栈式的。

  • 数据指令:把数据推到堆栈的最上面

  • 工作码指令:用堆栈顶部的数据作为输入值,用来计算一个函数


从指定公钥到指定脚本(方式)


  • 第三方交易:

    指定 MULTISIG, 比如发起一个2/3的多重签名

  • 绿色地址:

    第三方银行,如果被支付用户不信任则交易失败,现在很少使用

  • 高效小额支付:

    先发起 MULTISIG 交易,把可能花费的最大金额转到 MULTISIG 地址,支付方每隔几分钟就对自己的小额花费签名,直到挂机后,被支付方签名,整个交易被放入区块链中,交易才完成。而在被支付方未签名时,所有的交易都可以是一个双重支付,但这显然不会成功。因为最后需要被支付方的签名才能被纳入区块链中。而这引起的新问题就是,被支付方如果不签名,则支付方的所以币都会流入到 MULTISIG 第三方地址。

    上图的 lock_time 解决了这个问题。即要等待t时间之后才能把这笔交易记入区块链。这样如果被支付方不签名,过了t时间后,支付方通过 lock_time 收回自己所有的币。


区块链的两种hash结构:

3

  • 币基交易:创造新的比特币

    • 单一输入输出

    • 没有指针指向上一交易,因此pre_out中的hash字段为”000…00”

    • 存在coinbase 字段,矿工可放任意值进去


修订协议带来的问题


  • 硬分叉:

    老节点被视为无效,所以老节点会认为另外的分支(在该分支中新节点认为有效的区块被排除)最长、最有效,然后一直扩展,直到老节点更新,这样就造成了硬分叉,它们再也不会合并。我们不希望这种现象出现

  • 软分叉:

    即新节点使用更加严格的协议,而新节点认为有效的区块,老节点肯定也认为有效