概述
⽐特币⽹络的⽬的是将交易和区块传播给所有参与者
交易就像复式记账法账簿中的⾏。简单来说,每⼀笔交易包含⼀个或多个“输⼊”,输⼊是针对⼀个⽐特币账号的负债。这笔交易的另⼀⾯,有⼀个或多个“输出”,输出被当成信⽤点数记⼊到⽐特币账⼾中。
这些输⼊和输出的总额(负债和信⽤)不需要相等。相反,当输出累加略少于输⼊量时,两者的差额就代表了⼀笔隐含的“矿⼯费”,这也是将交易放进账簿的矿⼯所收集到的⼀笔⼩额⽀付。
tx.png交易也包含了每⼀笔被转移的⽐特币(输⼊)的所有权证明,它以所有者的数字签名形式存在,并可以被任何⼈独⽴验证。在⽐特币术语中,“消费”指的是签署⼀笔交易:转移⼀笔以前交易的⽐特币给以⽐特币地址所标识的新所有者。
交易是将钱从交易输⼊移⾄输出。输⼊是指钱币的来源,通常是之前⼀笔交易的输出。交易的输出则是通过关联⼀个密钥的⽅式将钱赋予⼀个新的所有者。⽬的密钥被称为是安全锁(Encumbrance)。这样就给资⾦强加了⼀个要求:有签名才能在以后的交易中赎回资⾦。⼀笔交易的输出可以被当做另⼀笔新交易的输⼊,这样随着钱从⼀个地址被移动到另⼀个地址的同时形成了⼀条所有权链。
常见的交易形式
- 最常见的是从⼀个地址到另⼀个地址的简单⽀付,这种交易也常常包含给⽀付者的“找零”,即输出包含新所有者的地址(买方地址)和当前所有者的地址(称为找零地址)。⼀般交易有⼀个输⼊和两个输出,这是因为交易输入,就像纸币那样能够,不能再分割。如果您在商店购买了5美元的商品,但是使用20美元的美金来支付商品,您预计会收到15美元的找零。
要注意的是,找零地址不必与输入时提供的地址相同,出于隐私的原因,通常是所有者钱包中的新地址。
- 集合多个输⼊到⼀个输出的交易,相当于现实⽣活中将很多硬币和纸币零钱兑换为⼀个⼤额⾯钞,像这样的交易有时由钱包应⽤产⽣来清理许多在⽀付过程收到的⼩数额的找零。
- 将⼀个输⼊分配给多个输出的交易,即多个接受者,这类交易有时被商业实体⽤作分配资⾦,例如给多个雇员发⼯资的情形。
交易的构建
钱包应用只需要指定⽬标地址和⾦额,其余的细节钱包应⽤会在后台⾃动完成。而且,钱包应⽤甚⾄可以在完全离线时建⽴交易!!!⽐特币交易建⽴和签名时不⽤连接⽐特币⽹络。只有在执⾏交易时才需要将交易发送到⽹络。
-
获取正确的输入
⼤多数钱包应⽤维护着⼀个含有⽤钱包⾃⼰密钥锁定的“未消费交易输出”⼩型数据库。完整客⼾端(空间占用大)含有整个区块链中所有交易的所有未消费输出副本。这使得钱包即能拿这些输出构建交易,⼜能在收到新交易时很快地验证其输⼊是否正确。
如果钱包客⼾端没有某⼀未消费交易输出,它可以通过不同的服务者提供的各种API或完整索引节点的JSON PRC API从⽐特币⽹络中拿到这⼀交易信息
使用命令行查询未消费输出举例
$ curl https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK //返回的部分数据如下 { "unspent_outputs": [ { "tx_hash":"186f9f998a5...2836dd734d2804fe65fa35779", "tx_index":104810202, "tx_output_n":0, "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac", "value":10000000, "value_hex":"00989680", "confirmations":0 } ] } //当中的value表明了价值是是⼀千万聪(satoshi),即 0.10⽐特币
-
创建交易输出(“脚本”的道理还不懂)
显示包含两个地址,还有一个隐式地址
交易的输出会被创建成为⼀个包含这笔数额的脚本的形式,只能被引⼊这个脚本的⼀个解答后才能兑换。简单点说就是,Alice的交易输出会包含⼀个脚本,这个脚本说“这个输出谁能拿出⼀个签名和Bob的公开地址匹配上,就⽀付给谁”。因为只有Bob的钱包的私钥可以匹配这个地址,所以只有Bob的钱包可以提供这个签名以兑换这笔输出。因此Alice会⽤需要Bob的签名来包装⼀个输出。
当然,对于零钱,也等于再给一个地址转账,只是这个地址是自己的地址
最后,为了让这笔交易尽快地被⽹络处理,Alice的钱包会多付⼀⼩笔费⽤。这个不是明显地包含在交易中的;⽽是通过输⼊和输出的差值所隐含的。如果Alice创建找零时只找0.0845⽐特币,⽽不是0.085⽐特币的话,这⾥就有剩下0.0005⽐特币(50万聪)。因为加起来⼩到0.10,所以这个0.10⽐特币的输⼊就没有被完整的消费了。这个差值会就被矿⼯当作交易费放到区块的交易⾥,最终放进区块链帐薄中。
-
交易的传播(Bob怎么确认???)
钱包应⽤可以发送新的交易给其它任意⼀个已联接到互联⽹的⽐特币客⼾端,任何⽐特币⽹络节点(其它客⼾端)收到⼀个之前没⻅过的有效交易时会⽴刻将它转发给联接到⾃⾝的其它节点。因此,这个交易迅速地从P2P⽹络中传播开来,⼏秒内就能到达⼤多数节点。
如果Bob的⽐特币钱包应⽤是直接连接Alice的钱包应⽤的话,Bob的钱包应⽤也许就是第⼀个收到这个交易的节点。然⽽,即使Alice的交易是从通过其它节点发过来的,⼀样可以在⼏秒钟内到达Bob钱包应⽤这⾥。Bob的钱包会⽴即确认Alice的交易是⼀个收⼊⽀付,因为它包含能⽤Bob的私钥兑换的输出。Bob的钱包应⽤也能够独⽴地⽤之前未消费输⼊来确认这个交易是正确构建的,并且由于包含⾜够交易费会被下⼀个区块包含进去。这时Bob就可以以⼀个很⼩的⻛险假定这个交易会很快被加到区块且被确认。
⼀个对⽐特币交易的常⻅误解是它们必须要等10分钟后被确认加进⼀个新区块,或等60分钟以得到六次确认后才是有效的。虽然这些确认可以确保交易已被整个⽹络接受,但对于像⼀杯咖啡这样的⼩额商品来说就没有必要等待那么⻓时间了。⼀个商家可以免确认来接受⽐特币⼩额⽀付。
-
比特币挖矿
这个交易现在在⽐特币⽹络上传播开来。但只有被⼀个称为挖矿的过程验证且加到⼀个区块中之后,这个交易才会成为这个共享账簿(区块链)的⼀部分。由此也知,⽐特币系统的信任是建⽴在计算的基础上的。
交易被包在⼀起放进区块中时需要极⼤的计算量来证明,但只需少量计算就能验证它们已被证明。
挖矿在⽐特币系统中起着两个作⽤:
- 挖矿在构建区块时会创造新的⽐特币(为何会,怎么办到的),和⼀个中央银⾏印发新的纸币很类似。每个区块创造的⽐特币数量是固定的,随时间会渐渐减少。
- 挖矿创建信任。挖矿确保只有在包含交易的区块上贡献了⾜够的计算量后,这些交易才被确认。区块越多,花费的计算量越⼤,意味着更多的信任。
类似多人解数独——解读难、验证容易、难度可以根据行列数更改(为了保证平衡:保证在10分钟内只有一人解出来等)
-
区块中的挖矿交易记录
⽹络中产⽣的⼀笔交易直到成为整个⽐特币⼤账簿——区块链的⼀部分时才会被确认有效。平均每10分钟,矿⼯会将⾃上⼀个区块以来发⽣的所有交易⽣成⼀个新的区块。新交易不断地从⽤⼾钱包和应⽤流⼊⽐特币⽹络。当⽐特币⽹络上的节点看到这些交易时,会先将它们放到各⾃节点维护的⼀个临时的已验证(验证交易合法性)、未确认的交易池中。当矿⼯构建⼀个新区块时,会将这些交易从这个交易池中拿出来放到这个新区块中,然后通过尝试解决⼀个⾮常困难的问题(也叫⼯作量证明)以证明这个新区块的合法性。
这些交易被加进新区块时,以交易费⽤⾼的优先以及其它的⼀些规则进⾏排序。矿⼯⼀旦从⽹络上收到⼀个新区块时,会意识到在这个区块上的解题竞赛已经输掉了,会⻢上开始下⼀个新区块的挖掘⼯作。它会⽴刻将⼀些交易和这个新区块的数字指纹放在⼀起开始构建下⼀个新区块,并开始给它计算⼯作量证明。每个矿⼯会在他的区块中包含⼀个特殊的交易,将新⽣成的⽐特币(当前每区块为25⽐特币)作为报酬⽀付到他⾃⼰的⽐特币地址。如果他找到了使得新区块有效的解法,他就会得到这笔报酬,因为这个新区块被加⼊到了总区块链中,他添加的这笔报酬交易也会变成可消费的。同时也会根据各⾃上⼀轮贡献的⼯作量将所得的报酬分给其他参与矿池挖矿的矿⼯。
基于这个区块每产⽣⼀个新区块,对这个交易来说就会增加了⼀次"证明"。当区块⼀个个堆上来时,这个交易变得指数级地越来越难被推翻,因此它在⽹络中得到更多信任。
按惯例来说,⼀个区块获得六次以上“证明”时就被认为是不可撤销的了,因为要撤销和重建六个区块需要巨量的计算。
全索引客⼾端可以追钱款的来源,从第⼀次有⽐特币在区块⾥⽣成的那⼀刻开始,按交易与交易间的关系顺藤摸⽠,直到Bob的交易地址。轻量级客⼾端通过确认⼀个交易在区块链中且在它后⾯有⼏个新区块来确认⼀个⽀付的合法性。这种⽅式叫做简易⽀付验证(SPV)
参考:《精通比特币》
注:区块链学习新人,若有不正确的地方,望指出
网友评论