比特币和以太坊的记账方式——UTXO和账户余额
第0章 引言
本文介绍比特币的核心概念UTXO,以及拿以太坊为实现相同的记账功能的账户制对比。
虽然这两个概念有很多文章介绍了,我希望描述的更易于理解。
第1章 银行账号的账户余额
你去银行里存钱,银行会给你建一个账户。银行账户在用户层面上呈现出来的是一个银行卡账号和用户的姓名,有了账户就可以记录用户存了多少钱。
在银行里账户的“物理实体”是这样的:用户的账户和余额使用一个数据库来存储,最简单的就是一张Excel表,比如:第一列是用户名,第二列卡号,第三列是存款金额……
用户账户上的余额调整实际发生的过程就是对数据库的更改。
很多科普比特币的文章就用银行账户来做类比,说比特币的地址就类似于银行账户,比特币地址后面的余额就相当于银行账户里的存款金额。这样理解是可以的,但涉及到比特币的底层设计时,就不是这样了。
第2章 比特币的UTXO
比特币本质上不是和银行的账户那样设计的。为了理解UTXO,我先讲一个故事。
在古代的欧洲,如果A要给B寄一个东西,又不想让邮递员偷看,就按下面的流程走。
第一步,A把要寄的东西放进一个箱子,并且加一把锁a。然后寄给B。因为加锁了,邮递员就不可能看到了。
第二步,B收到箱子后,又给箱子加了把锁b。再寄回给A。
第三步,A收到后,把锁a解开,然后再把带锁b的箱子寄回给B。这样B收到后就可以打开箱子了。
这就是古代的加密通信。
这个加密通信的过程总结来说是这样的:A给要寄的东西设置一个打开障碍,让这个障碍只有B的钥匙才能解开。
现在我们将上述过程全部电子化,搬到互联网上。因为在互联网上,B可以直接将自己的那把锁广播给A,可以省掉上述第一步。
A有一个电子文档要发给B,就可以这样干:
第一步,B直接通过网络将自己的电子锁发送给A。请注意,因为这一步没有加密,所以B的电子锁是所有在网络上的人都能看到的。
第二步,A拿到电子锁将文档锁起来,发给了B。因为文档加密了,所以虽然网络上的人都能看到加密后的文档,但无法解密。
第三步,B使用自己的电子钥匙解开加密文档,读到了明文。
电子加密通信结束。
这个电子加密通信的过程总结来说是这样的:A给通信内容设置一个查看障碍,让这个障碍只有B才能解开。
现在我们将上述电子加密通信改造成发送比特币。
A要发1个比特币给B,就可以这样干:
第一步,B直接将自己的比特币地址发送给A。请注意,发送过程是全网公开的,所有人都能看到B的比特币地址。实际上这个地址就是一把电子锁
第二步,A将B的地址当成电子锁,把自己的1个比特币,使用这把锁锁进去,然后将加密后的这个比特币发到互联网上去。请注意,全网所有人都是可以看到这个加密后的比特币的,但只有B有私钥(钥匙),所以只有B才能再次解开这个比特币,并且再次加密到别人的地址上。
A就这样完成了1个比特币的发送给B。
另外,在第二步中,A首先也是要用自己的私钥(钥匙)先将自己这1个比特币进行解密(这是上一个人发给A的加密过程)然后才能结合B的地址进行再加密。
A发送比特币给的过程总结来说是这样的:A给这个比特币设置一个解锁障碍,让这个障碍只有B(的私钥)才能解开。
所谓的UTXO就是只有B的私钥才能解开的这个东西,只B解开之前,这玩意就是未解锁状态,未解锁状态就是一个“未花费的钱”,比特币学术话语叫“未花费的交易输出”,英文叫unspend transaction output。
你有多少比特币,本质上就是你拥有多少UTXO。
第3章 UTXO的“物理实体”
上述是为了理解比特币UTXO的概念表述的过程,那UTXO具体的“物理实体”是啥样子呢?
UTXO具体是以数据的形式存在的,数据是存在比特币客户端里,任何一个比特币客户端都可以保存比特币网络上所有的UTXO,也就是所有人的比特币都是存在任意一个比特币客户端的。
一笔具体的UTXO,比如你的一个比特币,存储的数据主要代表了以下两个含义:
1一个数字,被命名为“聪”,这就是比特币的数量,1BTC=1亿聪。
2一个锁定脚本,就是第2章里描述的“解锁障碍”,如果谁想花这笔UTXO,就必须提供一个被满足“解锁条件”的数据,这个数据一般又叫着签名。
总结一句话,一笔UTXO就是“一个数字加一个锁定脚本。”
更具体一点,一笔UTXO在电脑里存的主要数据是以下四个部分:
1生成这笔UTXO的交易的txid;
2生成这笔UTXO的交易的输出序列号sequence。因为大部分交易是一个或多个输入,多个输出,第一个输入序列号是0,第二个是1。
3锁定脚本lockscript。
4是金额value
第4章 UTXO的好处
第一个好处是极端的安全。发送比特币就是一个先用私钥解密,再加密到目标公钥的过程,而接收比特币只需要提供一个地址。除非这套加密和解密的加密算法被破解了,否则不会出问题。这种加密算法是极端的安全的,如果加密算法被破解了,那全世界的银行什么的更加完蛋了,这种事发生的可能性是几乎不可能的。
第二个好处就是隐私。用户要是每笔交易都使用一个地址,那用户的资金是很难被追踪的。
第三个好处是非常大的可扩展性,这个要结合SPV验证、UTXO证明和UTXO分片这些理论来讲。这些内容目前的比特币(BTC和BCH)都是没有彻底解决掉的,如果解决掉了,比特币(BTC或BCH)是可以扩展到无限tps的。
第5章 以太坊的账户
相对于比特币的UTXO,以太坊的账户余额制就好理解太多了,你可以直接使用银行的账户来类比,非常准确。
以太坊的账户制就是一个代表特定用户的“地址”,可理解为银行卡号和用户名。当然这个“地址”是不计名的,不需要身份证的。这个“地址”后面就可以建一个值来充值以太坊的余额,地址还可以添加一些字段来充当“token的余额”,这就是为一个以太坊地址可以收非常多的各种币。
以太坊账户要发送ETH的过程是和比特币不一样的。以太坊这个系统是部署好一个“sent”函数,任何账户发送ETH都是向系统调用这个函数来完成。这就类似于银行改用户的余额就是使用数据的修改函数一样。以太坊系统验证账户发送ETH的过程是验证这笔交易是否是这个账户发出去的,用户使用“签名”的方式来证明是账户拥有者发送的交易。
第6章 账户制的好处
账户制比UTXO的好处很明显,可以节省大量的交易字节空间。账户制每笔交易都是只需要一个输入、一个输出和一个签名。UTXO是可能需要多个输入的,每个输入都需要单独签名,也可能需要多个输出,每个输出都需要锁定脚本。这样会大大增加交易的字节数量。
因为发送以太币是调用系统的sent函数,所以不需要在交易里留下“解锁脚本”和“锁定脚本”,而UTXO制相当于每笔交易都要写一遍“sent函数”,即在比特币系统里“sent函数”的代码是被重复填写无数遍的,这些全部是要记录在区块链里。而以太坊的sent函数的代码只需要部署到一个区块里,然后每一次发送交易,就去调用就好了,不需要重写代码。
账户制的另一个大好处就是可以编写复杂状态。
UTXO制的余额只有两种状态——花费或未花费。不存在50%花费这种概念。但以太坊的账户制就可以编写出花费条件,比如可以重写一个sent函数,让输入达到什么条件就发送多少币给输出,这样就可以实现各种状态。这就是有状态的智能合约的概念。你看EOS的ICO智能合约,实现了每隔23小时就可以向投ICO的地址发相应的代币,就知道以太坊的发送币可以编写出多少种可能性了。
比特币(BTC和BCH都一样)的脚本系统是无法编写出有状态的合约的,但以太坊就可以轻松编写出来。
第7章 结束语
比特币能够成功成为一种世界货币,UTXO居功至伟。
(欢迎加我微信号:HSL13116885 加入我的知识星球)
另请阅读:
《接下来让比特现金支持更多的创新——比特现金BCH5月份升级》