作者:黄马褂
时间:2018年9月28日
来源:https://zhuanlan.zhihu.com/p/45359764

比特币白皮书【交易】原文
We define an electronic coin as a chain of digital signatures.
我们定义一个电子货币是一个数字签名的链条,这个链条翻译成串可能会形象些,就是由一些数字签名从上到下这样链起来串起来的意思。
Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.
每个数字货币拥有者向下一位转移这个货币,用什么方式呢,在前一笔交易的hash值上进行数字签名,这样来表示我曾经真实收到我这笔钱,也就是我收到的这笔钱的来源是可以追溯的,不是我凭空产生的,而在下一位拥有者的公钥上进行数字签名,这样来表示是我把这笔钱转给你的,不是别人转给你的,而我这笔钱的来源,你也可以追溯到我的收款历史。把这些数字签名加入到这个电子货币的末尾。那么收款人可以通过验证这些签名从而验证出拥有者的这一串的数字签名。如图:

这个图,网上几乎没有详细的解释,基本上都是只翻译了英文,并且有的图上的英文还翻译得有问题,比如把owner’s signature翻译成了所有者的公钥,不是所有者的公钥,而是所有者的签名。
假设我是owner1,你是owner2,中间的这笔交易,是我支付给你的一笔钱的交易,那么从上往下看,首先这笔交易包含了上一笔交易的信息,同时也包含了你的公钥,实际上也就是你的收款地址,因为私钥生成公钥,公钥生成地址。那么把上一笔交易信息和你的公钥都进行hash,也就是把这些信息通过算法转换成一串固定长度的字符串,用字符串来表示这笔交易的全部信息,然后再附上我的签名,也就是我用我的私钥来给这笔转账签名。
那么第一,我用我的私钥签的这个名,它证明是我转给你的,不是别人转给你的,是没被修改过的,第二,它是能够对应我之前收到钱的那笔交易里面,我的公钥的,也就是可以验证到,我转你的这笔钱,是我之前管这个owner0收的。而同样,我把这笔钱转给你,当你进行下一步交易,比如转给owner3这个人的时候,也同样可以按这种方式,owner3可以追溯到是你从我这收的款,然后转给他的这笔钱,不是别人转给你的,也不是别人转给owner3的,也不是凭空产生的。就是这整个交易线索,它是可以一步一步往前追溯的。
The problem of course is the payee can’t verify that one of the owners did not double-spend the coin.
但这里问题是,收款人不能验证,前面的某位拥有者,没有双重支付这笔钱。
结合前面这个图,你可以验证到,是我转给你的这笔钱,但是你不能验证,我是不是同时把这笔钱转给了别人。
A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending.
一种通常的办法是,引入一个可信的中间权威机构,或者铸币厂,来检查每一笔交易是否发生了双重支付。
After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent.
每一笔交易完成后,这个币必须回收到铸币厂,然后再发行一个新的币,并且只有从铸币厂直接发行的币,才能被信任没有发生双重支付。
The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank.
这个解决办法的问题是,整个货币系统的命运完全依赖运作铸币厂这个公司,每一笔交易必须通过铸币公司,这些铸币公司就像银行一样。
We need a way for the payee to know that the previous owners did not sign any earlier transactions.
我们需要一种方式让收款人知道先前的货币拥有者没有对更早的交易签名。
For our purposes, the earliest transaction is the one that counts, so we don’t care about later attempts to double-spend.
为了达到目的,最早的交易就算数,因为我们不必在意后面试图发起双重支付的交易。
也就是我们只要关注最早的交易就行了。
The only way to confirm the absence of a transaction is to be aware of all transactions. In the mint based model, the mint was aware of all transactions and decided which arrived first.
确认一笔交易不存在的唯一方法,就是注意以前所有的交易。在铸币厂模式中,是由铸币厂来获悉所有的交易并且决定哪笔交易第一次出现。
To accomplish this without a trusted party, transactions must be publicly announced [1], and we need a system for participants to agree on a single history of the order in which they were received.
不通过可信中介来达到这样的目的,交易必须被公开宣布出来。这句话就是中本聪参考了W.Dai, “b-money,”这个文件里面的内容。我们需要一个系统让参与者公认一个唯一的历史序列。
The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received.
收款人需要确保,当一笔交易出现时,这笔交易都是大多数节点所公认的第一次出现。
小结一下
交易部分首先解释了,通过数字签名,可以往前追溯到所有的历史交易信息。同时也提出了,这种办法虽然能够追溯交易,但是不能够避免双重支付。于是又提出了需要避免双重支付,传统的办法是,通过铸币厂,也就是印钞厂,来监督每一笔交易,回收每一笔交易的钱,然后对新的交易发行新的钱。这样,每笔钱只能用在每笔对应的交易上,用过了,就回收了,没有了,不可能发生双重支付。但这不现实。
而不通过可信中介怎么来避免双重支付呢?首先明确,我只需要关注之前的交易有没有被双重支付,之后的不用管,也管不着。也就是我只关心我收到的这笔钱有没有被双重支付,而我是不是要双重支付,自然由我的交易对象去关心,而我交易对象是不是要双重支付,自然有他后面的交易对象去关心。我只关心我的收款就行。
然后,怎么防止双重支付,中本聪提出的方案,就是基本靠喊,也就是全网广播。对嘛,让大家都知道,这笔钱我已经付给你了,于是当我同时还想付给其他人的时候,如果再喊一遍,大家就会跳出来说,nonono,这笔钱我已经付给你了,我不能再付给其他人了。那我不喊呢,偷偷的搞呢,不行,这个程序就是设置的,只要你发起了交易,就得喊。你一喊,别人就会听见。所以,你只能保证这笔交易只能花给一个人,不能同时花给另一个人。
转载备注:我也可以不喊,偷偷地付给别人,但这样一来无法获得大部分人的认可,交易也就无效了。
本系列全部文章: