在国产特工电视剧里,我们经常听到密码本这个概念。特工上下线之间用电报传输消息,就需要用密码本来进行加密与解密,如果密码本被盗,敌方不仅能使用密码本进行情报破译(解密),还可以用来情报造假(加密),像这样加密解密使用同一把“钥匙”的加密方式,叫做对称加密。
事实上,已经有伟大的数学家使用数学手段创造出非对称加密算法,即加密和解密使用的“钥匙”是不同的。在这种算法里,每个账户都有自己的公钥和私钥,可以用任一把进行加密,另一把用来解密。在通信时,我们只需要把公钥交给对方,私钥自己本地保存好,就可以使用私钥用来解密对方发来的消息。(当然,仅仅使用这种方式虽然避免了信息破译,但是并没有解决信息造假的问题)
比特币的账户是通过椭圆曲线加密算法这个常见非对称加密算法实现的。简单理解,每个账户拥有公钥和私钥,私钥是需要自己严格保密的“密码”,而公钥就相当于可以让他人知道的“用户名”,但是实际上,由于公钥本身长度过长,不适合当比特币账户的“用户名”,比特币根据公钥重新创造了一个地址,作为“用户名”。私钥、公钥、地址的数学推导关系如下:
私钥->公钥->地址
也就是说,对于一个比特币账户只需要保存其私钥即可。当你需要接受比特币的时候,可以使用私钥生成自己的地址,告诉他人。
可能还会有人问,比特币的账户是怎么来的?其实比特币的账户是随机产生的,由于账户的私钥是可以推导出公钥和地址的,所以只需要随机产生一个私钥,就可以创建一个账户。
这是不是听起来很不可思议?然而事实上就是如此,私钥是一个256位的二进制数字,我用Python计算了一下:
In [1]: 2 ** 256
Out[1]: 115792089237316195423570985008687907853269984665640564039457584007913129639936L
这大约是10的78次方。我又上知乎搜了一下地球上沙子的数量,知乎告诉我大约是10的21次方。所以,只要能保证私钥的产生是随机的,不存在被破解的可能。
上图是我的比特币钱包地址(如果你想打赏我,可以转账比特币到3AEJTJXqNmZWX6KNw9rkVpSrVaW7KG5FkD)。如果读者能够破解到我的私钥,你也可以把其他人打赏给我的钱转走,哈哈!
目前银行、支付宝等都是基于账户的记账方式,大致运行方式是这样:
- 每个人在交易的时候使用自己一个账户。
- A和B发生交易时,系统同时在数据库中令A的账户余额减去x,B的余额加上x。如果A的账户余额小于x,必然不允许发生交易。
- 在过程2中需要保证原子性,即保证收支平衡,不能出现A账户减去x,但是B账户保持不变;也不能A和B余额的改变量不一致。
在这样的记账方式下,在一个交易来临的时候,我们需要维护账户数据库中交易双方的余额。
在比特币中,尽管可以通过交易链计算出每个账户的余额,比特币使用了一种非常新颖的UTXO(Unspent Transaction Output,未花费的交易输出)记账方式。其核心思想是:A用户只要可以证明他拥有10个比特币,就可以给B用户10个比特币,至于他的余额是多少,B根本无需关心,系统自然也无需额外记录。
假设当前区块产生了10个比特币,由聪聪挖出,那么将会产生一个交易(TX)——上帝给了聪聪10个比特币,该交易的输出方(Output)即聪聪,所以这个交易就是UTXO(未花费的交易输出)。当聪聪想交易给小田5个比特币的时候,只需要找到这个UTXO,然后花费掉这个UTXO即可。这个交易TX不再是UTXO,但是产生了两个新的UTXO。
我们可以看到,尽管聪聪的10个比特币只花费了5个,但是原来的UTXO也不能再继续保持UTXO状态,也就是说如果聪聪想再给小怡5个比特币,就不能再使用原来的TX,而是需要使用新的UTXO——聪聪给了聪聪5个比特币。这样的设计避免了多重支付问题,以防止聪聪使用多次原始的TX——上帝给了聪聪10个比特币。这样的机制像是一个铸币所,当进行一场交易后,原来的10个比特币在铸币所被销毁,进而被打造成了两个全新的5个比特币。
在一场交易中,交易的发起者主要需要提供以下信息:
- 上一笔UTXO交易的哈希值(指明你希望使用哪个UTXO)。
- 交易双方的地址。
- 你的公钥。
- 你用私钥对交易信息签名(加密)后的结果。
当矿工拿到你的交易信息,会进行以下校验:
- 比对你的地址和UTXO交易哈希值中的输出地址(确认该地址拥有该UTXO)。
- 用公钥计算出地址,比对该地址和你的地址(确认公钥的正确性)。
- 用公钥对签名结果进行解密,确认交易信息与解密后的交易信息一致(确认私钥的正确性)。
无论以上哪一步校验出现错误,交易都会校验失败。事实上,前两步校验都是为了最后一步服务的,因为只有账户私钥是绝对保密的。地址可以在区块中的交易信息中查询到;而公钥会在你发起第一笔交易后暴露出来。因此这就更需要你保管好自己的私钥。
一枚比特币不像一枚硬币一样不可切割,实际上比特币的最小单位是聪,1比特币=1亿聪。同样,既然UTXO作为拥有比特币的证明,也必然需要分割与组合。在之前的例子里,我们举的例子比较简单:输入一个UTXO,输出两个UTXO。在实际中,一个交易是允许多输入和多输出的。
当然,对于所有的输入,交易发起者都需要证明其财富归属权。