对于区块链开发,区块链不是一项新技术,而是一个新的技术组合。其关键技术,包括P2P动态组网、基于密码学的共享账本、共识机制(拜占庭将军问题,即一种分布式场景下的一致性问题)、智能合约等技术,都是已经有十年以上的老技术了。但是,中本聪将这些技术很巧妙地组合在一起,并在此基础上引入了完善的激励机制,用经济学原理来解决传统技术无法解决的问题。这个技术组合虽然有其独到的创新之处,但并非是颠覆性技术,是现有技术的有力补充。目前大部分人已经认同,区块链是“价值互联网”的基础协议,从这个角度看,其地位与当前“信息互联网”的HTTP协议相当,两者都是建立在TCP/IP协议之上的应用层协议,同是互联网的两大基础协议。因而,两者是互补而非颠覆的关系.

下面以一个具体的例子来说明一个区块链上的交易构成。假设有一个带有一个交易及一个输出的交易A,其中的输入列表和输出列表如下所示:
Input:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG
上文表示,交易A的输入0从交易f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6的0号输出中导入了50个比特币,然后该输出发送50个比特币到一个比特币地址的公钥Hash值(404371705fa9bd789a2fcd52d2c580b65d35549d,该公钥Hash值是十六进制表示,而非正常的base58表示)。
如果接收者想花掉这笔钱,那么他首先得创建自己的交易B,再引用该交易A的0号输出作为交易B的输入。
 

输入和输出
输入是对其他交易输出的引用,一个交易中通常列有多个输入。所有被引用的输出值相加,得出的总和值会在该交易A的输出中用到。Previous tx是以前交易的Hash值,Index是被引用交易的特定输出号,ScriptSig是一个脚本的前一半(脚本将在后文中详细讨论)。
脚本包含两个部分,一个签名和一个公钥,公钥属于交易输出的收款人,并且表明交易创建者允许收款人获得的输出金额;另一个部分是ECDSA签名,是通过对交易的Hash值进行ECDSA签名而得到的。签名和公钥一起,证明原地址的真正所有者创建了该支付交易。
输出中包含了发送比特币的指令,金额(Value)是以聪(Satoshi,1BTC=100000000聪)为单位的数值。ScriptPubKey是脚本的另一半(这点将在后文中详细讨论),可以有多个输出,它们共享了输入金额。一个交易中的每一个输出都只能被后来的交易当成输入引用一次。如果你不想丢币,那就需要把所有输入值的总和值发送到一个输出地址。如果输入是50BTC,但你仅想发送25BTC,那么比特币将创建2个25BTC的输出:一个发往目标地址,另一个则回到你的地址(称之为“找零”,详见1.1.5节)。在交易过程中,会产生一笔交易费,作为交易费支付的任何比特币都不能被赎回,生成这个区块的矿工将获得这笔交易费。
为了验证某个交易的输入已经被授权,可以收集被引用的输出中的所有金额。

比特币体系使用了一个类似于Forth的脚本系统,其目的是验证从某地址发出的比特币是否真正属于该地址的拥有人,输入的scriptSig和被引用的输出scriptPubKey会按顺序运行。如果scriptPubKey返回真,则输入被授权,证明是地址拥有人发出了比特币。通过脚本系统,发送者可以创建非常复杂的发送条件,人们为了收到金额,首先必须满足这些条件。举个例子,可以创建一个能被任何人赎回而无需授权的输出,也可以创建一个需要10个不同签名的输入,或者无需公钥仅由密码赎回的输出。

举例说明

在实际的区块链交易中,假设A拥有一个比特币地址,里面包含着还没有花费过的10个比特币。B也有一个比特币地址,里面一分钱也没有。当A想向B支付10个比特币时,A地址里的未花费输出变为零,而B的则会变为10 BTC。如果A想支付的金额与所拥有的相同,自然不会存在需要找零钱的问题。不过当手头的金额比要支付的大时,找零自然也是天经地义的事情。
假设A的地址上有35个比特币(如图1-2所示),当A想向B支付8个比特币时,如图1-2所示,只需要使用包含着20个比特币的那一笔未消费支出,并设置好要支持的金额即可,剩下的12个比特币则会返回给A,以便A在将来可以继续使用。

这样就有了一个找零机制,实际上,比特币在交易时会把消费时所用的地址(消费地址)的余额设置为零。当需要支付的金额小于可用余额时,在交易信息中必须告诉比特币网络零钱将要被发送至哪个地址,即“找零地址”。找零地址可能是也可能不是原先的发送地址。除此之外,发送地址所留下的剩余款项将由网络作为交易费支付给矿工。在上面的例子里,A可以选择将找回的零钱发送到一个新创建的找零地址上,或者将原先发送的地址设置为找零地址,并将零钱返回。虽然将发送地址作为找零地址对A而言是方便了管理,不过这也可能会造成A的隐私性降低,发送地址作为找零地址对A而言是方便了管理,不过这也可能会造成A的隐私性降低,在一定程度上还可能会影响到B的匿名性。
根据设计,每一笔比特币交易将在一个称为“区块链”的全球性的公共总账上永久可见,这就意味着任何人随时都可以在上面进行跟踪查询。通过将某个比特币地址与其使用者关联起来,好事者都可以据此绘制关于这个人与他人之间的资金转移的关系图。但如果是将找回的零钱发送至一个新创建的地址,那么就可以让这种追踪变得更加困难。


区块链演进BDF001要理解这一点,可以参考图。假设从地址A发送比特币到地址B后,零钱返回地址为A,则区块链会揭示地址A向地址B支付了一笔钱。同样的道理,如果有两个或两个以上地址参与其中,任何涉及这个接收零钱的找零地址都会揭示A作为支付方的交易。假如某个控制着的任何接收地址或付款地址的人其身份是众所周知的,那么其他有过交易往来的各方的身份也有可能被推断出来。

比特币网络中,数据会以文件的形式被永久记录,我们称这些文件为区块。一个区块是一些或所有最新比特币交易的记录集,且未被其他先前的区块记录。可以将区块想象为一个城市记录者其记录本上单独的一页纸(对房地产产权的变更记录),或者是股票交易所的总账本。在绝大多数情况下,新区块会被加入到记录的最后(在比特币中的名称为区块链),一旦写上,就再也不能改变或删除。每个区块记录了它被创建之前发生的所有事件。

区块链演进BDF001

相关文章: