概念
在《比特币:一种点对点的电子现金系统》中,电子货币被定义为:每一位所有者通过对前一次交易和下一位拥有者的公钥(Public key) 签署一个随机散列的数字签名,并将这个签名附加在这枚电子货币的末尾,电子货币就发送给了下一位所有者。
据此,我们可以理解到,电子货币被设计成以交易为载体表现,而实际上,在源码中,电子货币确实无实体类。
交易拥有交易输入、交易输出两个重要的属性。交易输入包含着上一笔交易的信息,及所有者的所有权证明。交易输出则包含着接收者的信息,以及转账数量。
当电子货币的所有者发起一笔交易时,可在交易输入使用此前收到交易信息、附上所有权证明,并在交易输出中填写转账数量及接收者的信息。输入数量与输出数量相比,多的部分则被当作手续费(Fee)。
疑问
- 为何电子货币不以实体类进行表示,而要间接通过交易表示?
数据结构
在bitcoin-0.1.5中,与交易相关的数据结构主要集中在main.h文件中,类图如下:
CScript是脚本类,可暂时抽象理解为存放所有权证明。
CTransaction包含一组CTxIn及一组CTxOut。CTxOut较为简单,仅包含数量和凭证。而CTxIn同样包含凭证,但却用COutPoint定位到属于自己的交易输出。
COutPoint仅包含一份哈希值及非负整数n,其中哈希值是交易哈希,而非负整数n则用于定位交易输出中的第n个输出。
链上数据
在Block 181中,有一份交易
a16f3ce4dd5deb92d98ef5cf8afeaf0775ebca408f708b2146c4fb42b41e14be,是传说中2009 年1月12日,中本聪发送了 10 个比特币给密码学专家哈尔芬尼。
在区块链浏览器中,我们可以看到这比交易的详细情况。
该笔交易有一个输入,两个输出,其中第二个输出地址与输入地址相同,手续费为0BTC,而顺着输入地址往上溯源,最终可发现12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S用于交易的BTC源自Block9的挖矿收入。