《Master Bitcoin》学习笔记02——比特币的交易模型

 

比特币的交易模型

模型基本描述

  前面一篇学习笔记01提到了一个交易模型(第三章的内容),在第五章中,除了对这个模型作个详细介绍以外,其实和我上一篇理解的交易模型差很少,一个交易包含输入与输出,比特币是在各个地址之间转移,不想中心化系统例如银行有个服务器,记录了每一个人的帐户,帐户这个结构体包含:交易记录,帐户余额等一切信息,可是在比特币交易网络这种去中心化的体系中,比特币的交易记录,一个帐户拥有多少比特币等信息存储在了区块链中,要像银行帐户同样,查询本身帐户的相关信息,只能经过查区块链中的区块获取,就像从数据库里查询数据同样,就像下面比特币的交易模型描述。
html

  模型图有几个重点:数据库

  • 我的可用的比特币是以帐单形式存在的,在发起交易时,查询区块链中我的可用帐单(帐单输出帐户是你),使用帐单来支付相应比特币,产生输出,实际上,是比特币在比特币地址之间的转移。
  • 本次交易的输入就是上次交易输出,比特币帐户(地址)查询余额和交易,就是对区块链里帐单里对你帐户输出的查询(上图中,对A可支配比特币的查询帐单输出:退给A的金额,对B可支配比特币的查询帐单输出:转帐给B的金额)
  • 本次交易的输入能够只有一张帐单的输出(若是这张帐单上的比特币足够),也能够包含几张帐单的输出(几张帐单加起来比特币>=这次须要支付金额),注意到,上面的>=比交付,由于不太可能利用已有帐单彻底无偏差地凑出本次需支付对应金额,由于帐单里的输出金额是不可拆分的,只能利用帐单来支付,要将银行里控制的我的帐户余额(一串数字)与比特币我的帐户余额(帐户下的帐单输出)区分开来。
  • 生成的帐单三中有给矿工的奖励,这个奖励是你自定的,给不给,给多少都行,这个奖励影响的是交易的优先级,奖励越多,越能尽早地将帐单加入区块链中,以保证交易的完成。帐单将会被保存在矿工的矿池中,按照奖励优先级来处理帐单。

交易输出的锁定与解锁(重点)——锁定脚本与解锁脚本

  上面提到了,一个帐户可支配的比特币来源于帐单的输出,而帐单是公开的,每一个比特币帐户都能知道这笔交易以及交易的输出,那么怎么保证输出只有对应的比特币的帐户能用呢?编程

  比特币的锁机制是经过一种类Forth语言脚本来,该脚本语言是种非图灵完备的语言,什么是图灵完备的语言呢,当一门编程语言在不限制内存和不限制时间下,可以解决全部问题,就称为图灵完备的,例如:C/C++,JAVA都是图灵完备语言,反之就是图灵非完备,比特币脚本里没有循环,因此这个脚本不能解决:在知足某种条件下退出循环,不然无限制地循环的问题。比特币的脚本语言是一种简单、低级的语言,它的不少功能已经被编译成立二进制文件,即便咱们不了解这种语言,只要可以调用接口就好了,或者能够直接使用C/C++,JAVA这样的语言来完成锁定和解锁的功能。那么为何不直接用C++等图灵完备的语言呢?这是出于安全考虑的,由于C++,JAVA等语言与内存、操做系统等运行环境,息息相关,而比特币脚本不须要任何运行环境都能运行,这就能抵抗基于内存的攻击或者其余透过系统漏洞的攻击(书上是这样解释的,我以为,比特币脚本更像一串机器语言的0-1串,因为低级机器语言的限制,很难进行高级编程,一样的,也保证了安全性,由于0-1机器语言很难入侵更改)。安全

  下面是锁定脚本与解锁脚本的例子,以说明锁的交互机制。服务器

  假设这笔交易为A向B支付比特币,在交易双方完成交易,生成帐单时(非矿工加的解锁和锁定脚本),A向这个帐单加上了锁定脚本,这个锁定脚本包含B的比特币地址C,由于B只公开了通过对公钥HASH后的比特币地址C,由于HASH函数的性质,比特币网络上的任何人,都不能经过C逆向获得B的公钥,也就是说,只有B知道本身的公钥可以构建解锁脚本,即只有B的公钥,才能经过HASH运算出地址C,只有能运算出地址C的比特币帐户,才能支配这笔比特币。网络

脚本语言运行

  该脚本语言仅由常数以及操做构成,从前日后遍历脚本,若遇到常数,则将常数入栈,若遇到操做,根据操做的具体要求,对栈顶元素进行弹出,或者弹出两个元素进行运算,再入栈,当一句脚本运行完毕后,仅只剩下栈顶元素,其取值为True\False,很清楚地,True表明验证成功,表明执行脚本的用户具备该帐单输出比特币的支配权,用户可以使用该帐单做为下笔交易(帐单)的输入,下面是个具体例子编程语言

锁定/解锁脚本类型

1)P2PKH (Pay-to-Public-Key-Hash)——比特币网络上大多数交易都属于此类型函数

  解锁脚本锁定脚本学习

2)P2PK(Pay-to-Public-Key)区块链

  写成收款方的公钥,收款方经过本身的私钥生成相应公钥来获取支配权。

3)P2SH(Pay-to-Script-Hash)

  这个脚本类型用于多重签名才能支付,好比,一个公司的帐户,由5我的支配,但只要有2我的以上的签名就能进行比特币支付。

  咱们考虑使用2)的方式来写多重签名命令:

  就是说,再使用上图方式多重签名的时候,须要将全部人的公钥都加在锁定脚本里,由于Attorney Public Key时是全部人的公钥运算的结果,而Public Key(公钥)有260bit长,这样下来,在人不少的状况下,甚至会使锁定脚本容量超过帐单自己,并且这样的脚本也难以维护,并暴露全部人之间的联系(尽管比特币地址是匿名的)。

  P2SH很好地解决了这个问题,P2SH分为除了锁定脚本、解锁脚本以外,多出了赎回脚本:

  使用方法是分两步:①使用赎回脚本确认用户能在属于定义好的群组;②使用解锁脚本解锁(Sig1 Sig2是2个群组用户的签名)

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息