我们都知道支付宝的转账流程:打开APP、输入转账地址或者扫二维码、输入转账金额、点击确认并输入密码。
比特币的转账流程也是一样的。但是比特币和支付宝背后的转账原理其实是千差万别的。
支付宝采用的是账户余额模型,比如大白支付宝账户有100元,给小黑转账80元,大白的账户余额会减少80元,变成20元,小黑的账户余额由0变成80元,大白和小黑的账户都会直接显示一个余额,这就是账户余额模型。
01.UTXO模型简介
比特币系统是一个点对点的电子现金系统,UTXO模型和我们的现金支付模型有很多的共同点。大白有两张面值50元的现金纸币,想要给小黑80元,需要把这两张50元的现金给小黑,小黑再找给大白20元,大白和小黑钱包里还有多少钱不会像支付宝那样直接显示一个余额,而是需要自己去数一下:钱包里有几张纸币以及每张的面额,然后进行加总。我们可以把现金的支付方式看做是UTXO模式的简化版本。
UTXO模型和现金支付模型的共同点:
①每条UTXO都有对应的面值,就像每张纸币会有一个面值一样。
②一条UTXO在交易中必须作为整体被消耗,就像纸币一样不可以撕开来使用。
如下图:左边的地址是比特币交易的发起地址,右边是2个接收地址,其中1个地址跟左边的发起地址是一样的,这笔交易的转账金额是0.26682745BTC,其中接收者拿到了0.1732608BTC,回到原转账地址的是0.09356665BTC。
③UTXO和现金一样都有最小面值,UTXO最小面值单位是聪,1个BTC=10的8次方聪,也就是1亿聪,1聪=0.00000001个BTC。
UTXO模型和现金支付模型的不同点:
①现金支付:找零是收款人做的;
比特币系统:找零是发起者自己进行设置的。
②现金的面值是固定的,UTXO的面值不固定,而是在发生交易的过程中也随之改变。
比特币的UTXO面值是不固定的,如下图,这是史上第一笔比特币交易,中本聪转给哈尔·芬尼10个BTC,这里花费了一条面值为50BTC的UTXO,找零之后得到了面值为40BTC的UTXO。
原本一个面值50的UTXO变成了两个面值分别为10BTC和40BTC的UTXO,如果中本聪给转给哈尔·芬尼的是15个BTC,那么面值为50BTC的UTXO就会变成两个面值分别为35BTC和15BTC的UTXO。
下图是一个比特币UTXO集的数据图,从2009年到2019年这10年之间,UTXO集的数据整体是一个增长的趋势。
③现金是不可能被双花的,比特币有可能双花。
同一笔比特币被花费两次甚至多次的情况就叫做双花。比特币它作为一种虚拟货币是没有实体的,它的本质是数据,有可能把一笔同样的比特币花费两次。
UTXO是UnspendTransactionOutput,即未消费的交易输出,每一笔比特币的交易都会有输入和输出。
当大白转账80元给小黑的时候,这80元对大白来说是一笔交易的输出,叫transactionoutput,对于小黑来讲这是一笔交易收入transactioninput,如果后面某个时候小黑把这80元又花出去了,那么这80元对于小黑来讲也变成了交易输出,而在小黑还没有把这钱花出去之前,它就是一笔还没有被花费掉的交易输出,transaction的缩写是tx,所以UnspendTransactionOutput就是UTXO。
我们看一下链上数据是什么样的?如下图:
其中右上方的confirmation就是确认的意思,它这里显示6+,也就是说这笔交易被确认的交易区块数已经超过了6个,通常一笔交易它被确认的区块数超过6个的时候,就认为这笔交易已经是一个完成的状态,并且不可逆了。
什么意思呢?先来解释一下这个确认的区块数,当一笔交易被放进一个区块里面,增加到区块链上最新的那个块的时候,这个时候的区块确认数是1,然后后面不断的会有新的区块增加上来,得到的区块确认数就会变成2、3、4、5、6......这样子不断的去增加,当它后面跟着的区块是5个,也就是说这笔交易得到的区块确认数是6的时候,我们就认为这笔交易不可能再逆转了。6+的旁边还有个锁的标志,当这个区块的确认数达到6以及以上的时候,这个锁就会变成锁上的样子。
02.找零机制
中本聪有一个面值为50的UTXO,转给哈尔·芬尼10个BTC,除了要写哈尔·芬尼这个收款人的地址,还要写找零地址,说明多出来的40个BTC想放到哪个比特币地址,可以是原来发起转账的地址,也可以是其他的比特币地址,必须得写一个找零地址,告诉矿工:剩下的40个BTC是想放在哪里的?
因此右边的交易收款方的地址有两个,一个是哈尔·芬尼的地址,一个就是中本聪的地址,中本聪设置的找零地址就是发起交易的这个地址,但是通常呢找零地址是不会和原交易发起地址相同的,这是出于隐私保护的考虑。
我们知道比特币是一个公开的大账本,所以如果总是用单一的地址进行交易的话,就容易有隐私泄露的危险,比如说别人一查这个地址,就可以看到地址上所有的比特币余额,知道你的具体资产有多少。因此呢,出于隐私保护的考虑,建议大家在使用比特币进行交易的时候,一定每一次都要使用新的地址。这样别人无法看到你拥有的其他比特币地址里面有多少钱,以及你用它们做了什么交易。
上图中的比特币就是中本聪的一个地址,它里面一共发生了45笔交易,大约还有18个比特币,但是这只是他其中一个地址,他手里究竟有多少比特币,我们是没有一个精确的数据的。据说中本聪拥有100万个比特币,也是通过其他的一些信息模模糊糊推断出来的,并不能完全肯定,因为中本聪不可能总是使用同一个比特币地址。
大家看上图的上面部分,这三个地址没有一个是一样的,那当找零地址与发起交易地址不同的时候,收款方这两个地址哪个才是找零地址呢?答案是:不知道,你没有办法知道,他是转账了0.29个BTC,找零37.208506个BTC,还是转账了37.208506个BTC,找零0.29个BTC。在blockchain这个浏览器上,你可以看到它对这笔交易中到底哪个才是转账的比特币做了一个预计,叫做estimatedbtctransacted,估计0.29个BTC是转账的金额。
如果交易的时候不写找零地址,剩下的钱会被系统默认为全部归属于矿工,全部给矿工当成是帮你打包交易的手续费。如下图:
上图中这笔交易的发起者,不知道是因为搞错了还是什么,我们可以看到这个交易,只有一个收款地址没有找零地址,所以除了收款地址收到的0.001个BTC之外,剩下的291.2409个BTC全部都变成了矿工的手续费了。
但是现在的加密货币钱包软件都是非常人性化的,照顾到了一些总是忘记或者压根就不知道需要设置找零地址的人,会自动帮用户去生成1个找零地址和手续费,如果你觉得钱包自动设置的手续费太高了,也可以进行下调,或者如果你想要交易被尽快确认的话也可以调高手续费。
04.旷工对UTXO进行校验
作为矿工,打包前要考虑3个问题:
1、发起交易者的地址里是否有足够的UTXO
也就是说是否有足够的比特币,矿工会查看交易者的UTXO集,旷工可以从这个集合里面去查询发起者交易的地址当中是否有足够的余额,如果余额不足,交易无效。
2、发起者的这笔交易使用的比特币是否是双花
矿工去查询区块链账本上的数据,检验这笔交易发起者之前是否已经用这笔比特币买过其他的东西,如果使用的UTXO已经支付过给别人了,存在双花的问题,那么这笔交易就不能通过矿工的交易校验。
3、发起者能否提供合法的私钥签名
合法的私钥签名用来证实发起者对这个比特币地址是有控制权的,如果不能提供私钥签名,那么矿工就会判定他发行的这笔交易是非法的,不能通过检验。
脚本语言在区块链中是一个比较抽象的概念,但也是一个非常重要的功能,我们经常会说比特币系统是图灵不完备的,以太坊是图灵完备的,这其实是在说他们的脚本是否图灵完备,图灵完备是对计算机能力的描述,指可以实现所有可编程计算机能够执行的计算逻辑。
一个图灵完备的脚本语言可以发挥计算机所有的能力,反之一个图灵不完备的语言是不能发挥计算机的所有能力的。比如在比特币系统当中,它的脚本是不图灵完备的,只能进行比特币的接收和发送,而以太坊的脚本是图灵完备的,或者严格说起来其实是半图灵完备的,它除了可以进行以太币的发送和接收,还可以部署智能合约,实现更多的功能。比特币的脚本是智能合约的雏形,但它不是图灵完备的,可是这里要说明一点:不图灵完备并不意味着就是一个缺陷,因为图灵完备涉及到的技术非常复杂,容易引发安全漏洞。
比特币的设计初衷只是想做一个现实生活中的支付货币,货币的交易和流通安全是第1位的,他想简简单单一点,以太坊的创始人“V神”曾经和比特币的核心开发团队建议,把脚本变得更丰富一点,但是被拒绝了,所以他之后就创造了脚本语言更加丰富的以太坊。
比特币的脚本系统是一个先进后出的堆栈模型,什么是堆栈?堆栈也是一个计算机科学里经常使用到的比较抽象的数据类型,堆栈的物体有一个特性,最后一个放进堆栈的物体总是会被最先拿出来。我们可以把堆栈想象成一个箱子,你往箱子里面先是放了一本书,然后放了一个帽子,最后放了一把剪刀,如果要拿出来,顺序是剪刀、帽子、书本。
所以最先进入箱子的东西是最后拿出来的,这就是一个先进后出的堆栈模型,或者后进先出的堆栈模型,堆栈中两个最重要的操作是push和pop,push操作是加入一个元素,pop操作刚好相反,是移走一个元素。
如上图:大家先看inputscripts输入脚本,输入脚本也叫做解锁脚本。
第1条指令是pushdata,pushdata意思就是说把数据推入堆栈,71是指这条数据大小是71个字节,它是用16进制的格式来表示的。
。
第2条指令是pushdata,也就是把这33个字节长的数据也推入堆栈。
那么推进去的这些数据到底是什么数字呢?第1条指令推入的数据是私钥签名,第2条指令推入的数据是公钥。现在这个堆栈里面有2层数据,第1层是发起方的私钥签名,第2层是发起方的公钥。
outputscripts
然后我们再来看看outputscripts输出脚本,输出脚本也叫做锁定脚本。
第1条指令是dup,dup是duplicate的缩写,dup就是把栈顶的数据复制一份。
第2条指令是hash160,也就是把发起方的公钥进行hash160运算得到公钥哈希。
第3条指令是pushdata,将后面这20个字节的数据即公钥哈希值推入堆栈。
验证交易
到这里所有验证交易是否合法的信息都已经推入到堆栈了,接下来就可以进行验证了。
第1步是equalverify,equalverify就是验证判断两样东西是否相等,在这里也就是需要判断比较栈顶的两个数据是否相等。
为什么要做这一步呢?堆栈里面它的第3层的公钥哈希值是从输入脚本inputscript里推导出来的,而第4层的公钥哈希值是从outputscript输出脚本里面拿出来的,输出脚本也叫锁定脚本,锁定脚本这个公钥哈希值是地址,是区块链上大家都能查到的,但是输入脚本的公钥哈希值是只有拥有对应公钥的人才可以算得出来的。
前面我们讲过,非对称加密的私钥和公钥,私钥是要自己保存好的,公钥可以去分享给别人,私钥到公钥是一个单向的推导过程,不能反推,但是因为量子计算机的出现,它是一个非常强大的计算机,有可能做到从公钥反推出来私钥。
一开始设计的时候,中本聪是直接拿公钥作为地址的,这是非常不安全的,后来程序员们把公钥的哈希值进行编码作为地址,而量子计算机目前还没有办法做到直接从地址反推出来私钥。
因此现在比特币区块链上,私钥和公钥都是大家轻易不会拿出来分享的,如果你想要使用一个地址里的比特币进行转账的话,那么你首先得先提供对应的公钥,让旷工可以检查,你是这个地址的拥有者,因为你有相应的公钥。第1步的检查就是把发起者输入脚本里的哈希值和输出脚本里的哈希值进行对应,看是否是相同的,如果是相同的,就先通过了第1道检验。
接着是第2步检验叫checksig,就是利用发起者的公钥对签名进行检查,检查通过后可以确认这笔交易是本人发起的。
以上就是比特币的UTXO模型校验的过程。
04.量子计算机
量子加密是加密技术第7代密码学技术,它的上一代是RSA加密系统,RSA是现在应用范围最广泛的加密手段。比特币采用的是椭圆曲线ECC算法,单位安全强度是要强于RSA算法的。但无论是ECC还是RSA,这两种加密算法在量子计算机面前都还不够强大,很容易会被破解,量子计算机一旦成功,对目前网络、通讯、通信和银行上的RSA加密算法会构成威胁。
比特币系统中的加密算法一共是两种,一个是椭圆曲线算法,一个是哈希算法,椭圆曲线算法是用于私钥到公钥,哈希算法是用于公钥到地址。私钥到公钥的推倒过程原本是不可逆的单向的,公钥不可能反向推导出私钥,因为公钥反推私钥的工作量非常的大,目前的计算机是无法胜任如此大的工作量的。而最新的量子计算机被认为是可以做到从公钥反推私钥的,甚至有人说量子计算机投入使用的时候就是比特币的终结之日。
最近有很多媒体都在报道谷歌研发的量子计算机取得了不小的进步,谷歌的研究人员表示,谷歌的处理器可以在3分20秒之内完成目前全球排名第一的超级计算机需要1万年才能完成的计算,按照一位普利茅斯大学教授的估计,量子计算机可以在几分钟之内就从公钥反推出私钥是什么,而在知道所有私钥之后就可以拥有对应地址的比特币的转账权利了。
所以比特币系统没有直接拿公钥来作为地址,而是拿公钥哈希值进行编码之后作为地址,公钥到地址之间多的这一步哈希处理就是为了在量子计算机面前多放一个障碍,有了这个哈希函数,目前的量子计算机还无法有效的破解比特币的私钥,直接从一个地址去反推私钥,这是目前量子计算机还无法做到的。
但是UTXO模型里,我们看到了当你在一个地址里面发起一笔转账的时候,你的脚本里面就暴露了这个地址对应的公钥。所以我们在使用比特币地址的时候,还是建议大家只使用一次性的地址,也就是说这个地址一旦发生过向外的转账,你后面就不要再去用它了,你进行转账的时候就把你们的钱全部转出,因为在转账的时候,这个公钥已经暴露在区块链上了,量子计算机已经足够强大了,它可以做到在几分钟之内从公钥反推私钥,所以如果一个地址反复的去用,公钥已经在网络上暴露了,它是非常的不安全的,我们可以把这些比特币转到一个新的还没有使用过的地址里面,那这个地址它的公钥是没有暴露的,暂时还是安全的。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。