比特币交易流程总结

比特币交易流程总结

    摘要:比特币是一个分布式的点对点网络系统。它被设计成为一种完全通过点对点技术实现的电子现金系统,可以不通过中间任何的金融机构直接由一方发起并支付给另外一方。比特币系统基本单位是UTXO(未经使用的一个交易输出),账户是通过脚本来进行金额的锁定,要提供一个包含用户私钥的解锁脚本来解锁输出。比特币系统通过PoW(工作量证明)生产区块已证明交易的合法性,难度会随系统的算力进行相应的改变,平均十分钟出一块区块。基于与上一个区块生成的随机散列来生成新的散列提供给下一个区块,形成了多路链式结构(会出现分叉),有效避免了系统的恶意攻击(51%攻击)。
    主要是对知识的总结,理解会有偏差。从小明向小红转钱来进行知识的整体的梳理。

引子

小明一天和朋友出去游玩,在路上结识朋友小红,两人相聊甚欢,临走之际小明对小红说:"我俩都喜欢区块链,要不我送你 1w 区块链做一个纪念一下,把你的地址给我一个"。我们占且不说小明那来的这么多btc,也不讲私钥通过椭圆曲线相乘变成公钥,公钥双哈希再Base58Check编码形成比特币地址,最有可能是原因就是小明拿着锄头从电脑里挖出来的。小红刚和小明认识没有多久又怎么好意思要小明的东西,但耐不住小明一片心意,盛情难却啊。小红只好会回答:"我俩认识时间不长,无需如此,要不折个现,给个零头就行,我的支付宝账号是xxxx?"。小明一脸生气?,“这个太麻烦了,我还是转给博主吧”。

交易

当小明转给小红的时候,当一个交易诞生的那一刻,比特币交易会被一个或者多个签名加密,这些签名标志着对该交易指向的比特币资金的使用许可。接下来,比特币交易被广播到比特币网络中。任何一笔交易都是一个含有输入值和输出值的数据结构,该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。 当这笔交易被网络中的一个节点认可时,网络节点会把这个交易继续广播到其他相连接的节点,发起着会收到一个交易有效接受的消息;当这笔交易未被认可时,节点会拒绝交易并返回交易拒绝的消息。

如果仅仅到这里这和中性化支付系统是差不多了,中心化系统此时会在系统中记录用户传过来的消息进行消息处理记录,返回客户端交易完成就行了。中心化的系统这里解决的是两个陌生交易者的信任问题,它以自己作为信任担保。现在的系统也是分布式的框架,中心化的分布式系统解决的是大流量的问题,因为系统是中心化的所以请求和事物处理也过于集中,就会有事物过于集中。单点是无法处理怎么大流量。不管是业务的拆分部署,数据库的分库分表,系统的降级限流,软负载均衡的搭建都是以更小的代价来处理更多的事物请求。我之前感觉这是一个全新的技术,现在理解的比特币它牛逼在,它提供了一个全新的解决方案。

交易是将钱从交易输入移至输出。输入是指钱币的来源,通常是之前一笔交易的输出。交易的输出则是通过关联一个密钥的方式将钱赋予一个新的所有者。这样随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链。因为是链式的存储结构所以就有了溯源的功能。



每一笔的交易都是通过比特币交易脚本来实现的,一个锁定脚本和一个解锁脚本。锁定脚本是一个放在一个输出值上的“障碍”,同时它明确了今后花费这笔输出的条件。由于锁定脚本往往含有一个公钥(即比特币地址),解锁脚本是一个“解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,同时它将允许输出被消费。

多笔交易汇聚在一起就是一个账单(区块),虚拟货币是如何被系统认可,认为这笔交易是成功的呢,比特币系统的参与者共同维护了一个公共的账本,也就是一个公共的数据结构,每一个参与者都会共下载一个完整的账本数据,当一个参与者完成了区块的计算,会把这个计算结果全网公布,其他节点得到这个结果后会验证,验证成功之后会把这个写入自己的区块中表示认可,并立刻进行下一个区块的计算。

交易是被写入区块之中,但使用区块来进行校验会是数量过大,区块头中的merkle结构就是为了快速校验和查找。区块头还被用来与前一区块相连接。矿工挖矿也是也是通过改变 Nonce来计算区块的hash值,计算出来的值小于难度目标,区块就是可以被写入帐本之中,随之系统会奖励矿工一笔挖矿的费用。这笔费用是很特殊的,他没有输入来源,称为创币交易,不包含“解锁脚本“(又称作 scriptSig)字段,字段被Coinbase所代替。区块难度会随着系统算力来进行相应的改变。这个就比特币系统中的PoW(工作量证明)。因为所有区块头都与前一块区块相连接所以想要修改交易必须要重新计算区块之后的的所有区块,代价过于庞大几乎是不可能的,所以说区块链是不可以被篡改的。理论上来讲,一个人拥有51%的算力,他就可以随意修改比特币系统了,但是他拥有这么大的算力之后,他完全可以用算力来进行挖矿牟利不需要用这么大的力气来进行数据修改。51%攻击就这样不太可能发生。

 区块数据结构:


区块头数据结构:

当此时这笔交易已经算是完成了,但是系统可能会出现分叉所以建议的时候当交易被写入帐本之后的六个区块后才算正式确认交易成功。

双重支付

比特币是一个分布式的点对点网络系统。它被设计成为一种完全通过点对点技术实现的电子现金系统。就是因为上面的特证。必然会出现分布式系统问题,就会引入拜占庭将军问题,之前一直以为这是区块链系统问题,后来慢慢了解这个是分布式系统的问题。分布式系统中就会存在一致性问题,信息传输延迟,消息顺序问题。基本会把并行数据改变为串形处理。使用CAP/BASE原则(了解一点,但不总结就忘记,以后总结一下)。

注:拜占庭将军问题是一个模型,它表示的是 信道可信下的一致性问题。对应的蓝军问题模型是在一致性相同下信道不可信问题。通过了TCP/IP 协议解决。

因为比特币是虚拟货币就会有双重支付问题。因为是在一个分布式系统之中,就会出现系统中有两个矿工同时找到了符合要求的Nonce的随机字符串他们会同时广播到系统中,离他们相近的就会验证和同意这个区块的产生,这个时候体统就出现了分叉.此时系统会分成A区和B区他们会同时进行下一个区块的计算。之后的验证大家都会找最长的作为主链来进行计算链来进行计算


黑色表示当前账簿主干。此时,可以随便选择一个页作为当前主分支,例如选择A:

此时如果有一个新的账簿页是基于A的,那么这个主干就延续下去:

如果这个主干一直这么延续下去,表示大家基本都以A为主干,B就会被遗忘。但是也有可能忽然B变成更长了:

那么我们就需要将B分支作为当前主干,基于这个分支进行后续工作。

从局部来看,虽然在某一时刻各个小组的账簿主干可能存在不一致,但大方向是一致的,那些偶尔由于不同步产生的小分支,会很快被淹没在历史中。

双花问题就是基于这个点来实现的,当攻击者向一个用户A支付了一笔钱,用户收到了区块确认之后进行交易,但是攻击者同时又用这笔钱想另一个用户B支付同一笔钱,故意造成分叉来使上一笔交易失效。比特币是通过PoW来解决的,有这个算力去攻击还不如去挖矿赚钱。避免了51%攻击。

第一步,攻击者准备从受害者A手里买10比特币的黄金,他签署交易单给受害者A,转10个比特币给受害者A。

第二步,这笔交易在最新的账簿页中被确认,并被各个挖矿小组公告出来。受害人A看到公告,确认比特币到账,给了攻击者10个比特币等值的黄金。

第三步,攻击者找到账簿,从包含刚才交易的账簿页的前一页做出一个分支,生成更多的账单页,超过刚才的分支。由于此时刚才攻击者制造的分支变成了主干分支,而包含受害者A得到钱的分支变成了旁支,因此挖矿组织不再承认刚才的转账,受害者A得到的10比特币被取消了。

第四步,攻击者可以再次签署交易单,将同一笔钱支付给受害者B。受害者B确认钱到账后,支付给攻击者等值黄金。

至此,攻击者将10个比特币花了两次,从两名受害者那里各购得等值黄金。攻击者还可以如法炮制,取消与受害者B的转账,将同一笔钱再支付给其他人……

硬分叉和软分叉

软分叉是通过数据结构的协议进行改变,节点可以不进行继续升级,但产生的区块会不合法。

硬分叉是永久性分叉,修改了相应的结构,需要升级节点,产生了永久的分歧。

参看:什么是硬分叉,什么是软分叉,什么是共识?

参考:

1.<<精通比特币>>

2.拜占庭将军问题深入探讨

3.什么是硬分叉,什么是软分叉,什么是共识?

4一个故事告诉你比特币的原理及运作机制

没有更多推荐了,返回首页