比特币的拥有者如何证明自己拥有比特币?

区块链实际上是比特币的账本,记录着谁拥有多少比特币,只不过这个账本是保存在互联网上的、分布式的,并不是由一个中心机构或者服务器来存储。有了账本,剩下的问题就是比特币的拥有者如何证明自己拥有比特币?就像你在银行开立了一个账户,等你想给其他人转账的时候,你需要在ATM上插入卡,然后输入密码。卡就相当于比特币的地址,密码就相当于比特币的秘钥,有了正确的地址和秘钥,就可以对外宣称自己对比特币的拥有权,就可以把比特币转账给其他人来做一笔转账交易。

在ATM上提取一笔现金,输入密码解锁账户,我们相信ATM机不会泄露密码。那么在比特币的世界里,我们如何通过私钥来校验一个地址上的比特币的归属权呢?

比特币的归属权是通过加密领域技术来实现的,我们先来了解下加密领域的原理,加密领域大体上经过了3个阶段,第一个阶段拼算法,把加密逻辑写在一个非常高深的代码里,后来发现无论把多么复杂的逻辑写在代码里,总有高手可以破解。于是产生了对称秘钥加密,对称秘钥加密通过一个对称的秘钥进行加密数据,然后传输或者保存,需要的时候再通过同一个秘钥进行解密还原原来数据,缺点是秘钥是共享的,无法安全的保存秘钥,尤其是跨组织的场景。后来,聪明的安全科学家们发明了非对称加密算法,例如:RSA,非对称算法拥有一对秘钥,一个公钥和一个私钥,私钥可以推导出公钥,但是公钥不能推导出私钥,公钥加密的数据私钥可以解密,私钥加密的数据公钥可以解密,如果组织A向组织B传递数据,那么组织A使用公钥进行加 密,组织B使用私钥进行解密,因此,组织B需要小心的保存好私钥,而公钥是公开的,这是典型的非对称加密场景,能够有效的防止数据被偷窥、被篡改。非对称加密还有另外一个场景,就是签名,签名是加密场景的逆向场景,商户B通过自己的私钥加密数据,然后把加密的数据传递给商户A,商户A通过公钥进行解密,如果解密的数据正确,则说明数据是由A发送的,有效的保证了数据的防篡改,从这两个场景我们看到,公钥是公开的,可发给任何人,私钥是私密的,用来解密或者签名的。

比特币证明归属权的示意图如下:

解密比特币的那些核心技术原理
从上图可见,现实生活中我们用钥匙打开锁头,我们用密码在ATM上提取现金,那么在比特币系统里,我们通过秘钥来实现比特币的转账,实现价值的转移。

更具体来讲,一笔比特币交易会把一定数量的脚本锁定在一个地址,声明拥有这个地址的用户会通过密匙的签名来证明自己拥有这个地址,然后,花费这笔比特币,这笔比特币被花费后并不会消失,会被锁定在其他人的地址上,其他人可以使用同样的方法来花费这笔比特币。

从上面的过程,我们总结了两个动作,锁定与解锁,这和我们平时锁锁头和开锁头是对应的,在比特币系统里是通过锁定脚本和解锁脚本来实现的。

  1. 锁定脚本把比特币关联在一个比特币地址上,证明了比特币归属这个地址。
  2. 解锁脚本提供证明,证明这个地址归我所有,这个比特币也归我所有,我可以用来支付。

下面我们举一个例子详细说明:

用户Alice在比特币里地址A上拥有10个比特币,Alice与Bob想做一笔交易,Bob把自己家的汽车卖给了Alice,Alice需要向Bob支付10个比特币,Bob的比特币地址是B。 在之前的交易中,Alice拥有的10个比特币被锁定在Alice的比特币地址A上,其来源可能是挖矿所得或者别人转账而来,我们会在后续详细描述如何获得比特币,这里我们只关注证明Alice拥有比特币的交易的锁定脚本。

锁定脚本的逻辑格式为:

比特币数量 来源 锁定地址
10 挖矿所得 地址A

如果想花费这个锁定脚本,需要的解锁脚本如下:

解锁地址 解锁
地址A 地址A的公钥、地址A用私钥对前一区块头哈希散列值的签名

具体的解锁过程如下:

  1. 使用地址A的公匙推导出地址,与地址A对比,如果一致则证明公匙提供正确,进入下一步。
  2. 使用地址A的公匙解密签名,如果获得的值与前一区块的哈希散列值一致,则证明解锁成功,可以花费地址上的10个比特币。

其实,锁定和解锁脚本是通过逆波兰表示法的基于堆栈的脚本实现的,由于本文篇幅有限,这里不展开介绍,会在后续的文章中详细介绍锁定和解锁脚本的原理和流程。