区块链基础概念--比特币运行机制
区块链基础概念–比特币运行机制
基于《区块链-技术驱动金融》一书
比特币交易:
地址转换:一个交易中输出的币,要么在另一个交易中被完全消费掉,要么就一个都不被消费。所以需要自身将剩余的币转给自己所有的另一个地址
有效验证: 从所引用的交易开始验证到最新一次的交易,而不需要从头开始
资金合并: 发起一个交易,交易里有两个输入和一个输出,输出的地址是自己的地址
共同支付:交易中同样包含两个输入和一个输出,两个输入的hash指针不同,因此这笔交易需要支付者两人的签名
- ScriptSig(输入脚本): 指定了对应公钥的签名
- ScriptPubkey(输出脚本): 指定了公钥或是公钥哈希值的地址
交易输出: 凭借哈希值为X的公钥,以及这个公钥所有者的签名,才可以获得这笔资金。
判断一个交易是否有效,需要我们把输入、输出脚本串联起来形成串联脚本:
比特币的脚本语言不是图灵完备的,而是堆栈式的。
数据指令:把数据推到堆栈的最上面
工作码指令:用堆栈顶部的数据作为输入值,用来计算一个函数
从指定公钥到指定脚本(方式)
第三方交易:
指定
MULTISIG
, 比如发起一个2/3的多重签名绿色地址:
第三方银行,如果被支付用户不信任则交易失败,现在很少使用
高效小额支付:
先发起
MULTISIG
交易,把可能花费的最大金额转到MULTISIG
地址,支付方每隔几分钟就对自己的小额花费签名,直到挂机后,被支付方签名,整个交易被放入区块链中,交易才完成。而在被支付方未签名时,所有的交易都可以是一个双重支付,但这显然不会成功。因为最后需要被支付方的签名才能被纳入区块链中。而这引起的新问题就是,被支付方如果不签名,则支付方的所以币都会流入到MULTISIG
第三方地址。上图的
lock_time
解决了这个问题。即要等待t时间之后才能把这笔交易记入区块链。这样如果被支付方不签名,过了t时间后,支付方通过lock_time
收回自己所有的币。
区块链的两种hash结构:
币基交易:创造新的比特币
单一输入输出
没有指针指向上一交易,因此
pre_out
中的hash
字段为”000…00”存在
coinbase
字段,矿工可放任意值进去
修订协议带来的问题
硬分叉:
老节点被视为无效,所以老节点会认为另外的分支(在该分支中新节点认为有效的区块被排除)最长、最有效,然后一直扩展,直到老节点更新,这样就造成了硬分叉,它们再也不会合并。我们不希望这种现象出现
软分叉:
即新节点使用更加严格的协议,而新节点认为有效的区块,老节点肯定也认为有效