从地址格式探讨Bitcoin和Ethereum的差异
Bitcoin和Ethereum在许多方面有着截然不同的设计,这篇文章会从地址格式出发,比较两者在交易格式以及身份认定上的差异,透过这些差异了解两套系统在设计哲学上的不同之处。由于篇幅的关系,本文会略过一些较为基础的细节。
区块链上的地址
地址(Address) 是一个可以被某种交换网络系统辨识的资讯,透过这样的资讯使得网络中的个体可以顺利进行收发作业,比如说现实生活中的邮件地址,或是互联网中的IP address。同样的在blockchain 这样的分散式系统中,也需要一套地址格式,让虚拟货币或是抽象的状态可以在这样的网络中传递、转移。
Blockchain 基本上是透过非对称式密码学签章保护资产(或是状态) 的安全,也就是认私钥不认人,拥有私钥等于拥有对应地址下的资产。假设今天不使用现成的钱包solution,Bob 自己用电脑产生了一副key pair,那么他该如何在这两套blockchain 系统中,产生自己的地址,让Alice 可以发送资产给他呢?
Ethereum
以Ethereum 而言,所谓的地址(for External Owned Account — EOA) 其实就是public key 经过Keccak-256 hash 过后的部分值(truncate to 20 bytes),私钥跟地址之间存在着one-to-one 对应,这样的情况比较单纯和直觉,就像台湾的地址门牌一样,ㄧ个地址只对应到一户人家。
而由于Ethereum本身的设计就是所谓的account based system,因此交易格式中存在着from以及to的两个栏位,这意味着每一笔交易都有明确的收发对象,Alice若要将资产转移给Bob,只需分别将from及to填上Alice和Bob的地址,接着附上应有的签名,再将这些资讯送到区块链上做验证即可,可以想像成在信封上写上寄件者和收件者的地址,贴上邮票后,丢入邮筒。
Ethereum tx example from etherscan.io
Bitcoin
同样的场景转换到Bitcoin 时,事情就比较复杂了些。首先Bitcoin 本身是所谓的Unspent Transaction Output (UTXO) 系统,每一笔tx 可以包含数个input 以及output,没有一对一的from/to 关系,比较不精确的翻译就是一笔交易可以有多个sender/recipient ,而单一的from/to 是在account based 系统下才会强调的观念。
Bitcoin tx example from blockchair.com
每一个output 都会有一个所谓的locking script,目的在于限制这笔output 只能被指定的对象花用,也就是谁有能力解开这个锁,就有花用这笔资产的能力。一般这个locking script 的逻辑会是「拥有某把private key 的人可以花用这笔资产」,但事实上它可以实现多种逻辑,比如说「谁知道1+1的答案就可以花这笔资产」或是多签(Multisig),可以算是Ethereum smart contract 的前身。
Bitcoin locking script 具有逻辑多样性,也许是为了降低一般收发的复杂度,因此有了几种标准的locking script template,例如P2PKH, P2SH,而每种script template 所要填入的资讯不同,交易的发送方需要从收方取得特定的资讯才能正确将资产做转移,例如P2PKH 的locking script 需要填入public key hash,为了方便传递这些讯息,需要一套编码标准将这些资讯组合成一个地址。
Bitcoin 的地址是一串base58 encoded string (先不讨论Bech32),经过decode 后,可以得到两部分资讯
version (1 byte)
payload (20 bytes)
version 代表着script type,payload 则是产生该种locking script 所需的资讯(例如public key hash for P2PKH)。说到这里,终于可以回到一开始的问题:Bob 要如何产生对应的Bitcoin address 给Alice?,首先他需要决定他想收到哪种script type 保护的output,接着将所需的资讯用base58 编码成地址发给Alice,Alice 收到地址后可以组出指定格式的locking script,再包装成合法的transaction 发出去。
谈到产生地址的方法,就必须说明一个Bitcoin 不太一样的特性:同一副key pair 可以产生不同的Bitcoin address!换句话说,key pair 和Bitcoin address 两者之间并不是one-to-one 的对应的关系。就算先不考虑比较复杂的P2SH,以key compression 来看,同样的private key 就有两种public key 表示的方式了,也就有两种对应的P2PKH address,若再将P2SH 考虑进来,就有更多种可能,除此之外,Bitcoin 因为segwit 的关系又有新的地址格式(Bech32),光是最简单的单签,就可以有至少四种以上的地址。
为什么会有这样的结果?其实是因为实际在Bitcoin 链上运作的是locking script,script 本身具有逻辑的多样性,可以想成一个方程式有多个解,而Bitcoin address 代表着某一种标准script,说穿了只是其中之一解而已。
基于这样的特性,手上拥有一把private key 的Bob 其实在他产生私钥的当下,就等同于产生了四个以上的Bitcoin 地址,换言之,这些地址下的资产,都是属于他的,这个事实也引出了一个有趣的问题:如何辨别资产的所有权?
资产所有权
如果我们把资产所有权定义成「我有能力动用的资产」的话,那么除了一对多的地址以外,广义来说还可以把一些non-standard 的output 给囊括进来(前提是要知道如何unlock)
私钥与地址的一对多关系
而目前的explorer 和钱包几乎都是以address 来判断余额以及utxo 的,因此如果碰到non-standard output,你的钱包是无法判别它是属于你的资产,但实际上它是属于你的。也就是说,透过non-standard script 是有能力发送一般explorer/wallet 无法辨识地址的交易。若以上述的资产所有权定义出发,Bitcoin 根本没有一套标准的方式去计算属于一个使用者(private key owner) 的所有资产,我想这也强烈呼应着Bitcoin 的匿名特性,所谓的匿名不单只是address背后没有实名认证而已,Bitcoin 可以达到的匿名层级是根本无法判断交易的收发方。如果以account based 的角度去看这个特性的话,会认为帐本不accountable,没有办法判断收发方的话就无法记帐,但以scripting UTXO 的角度去看的话,这实在是再合理不过了,毕竟余额的概念就是连结着account。今天如果有一个人拿了Bob 的public key 写了一串non-standard locking script,只要他不告诉Bob,Bob 甚至不知道他可以使用这笔钱,这意味着可能连key owner 本身也无法确切知道他的实际资产总额是多少,此点不像account based 的系统,如果我不告知你而转了一百块给你,你会从你的帐户余额发现多了一百元。
Bitcoin 其实是可以没有地址概念的,地址的出现让Bitcoin 可以做到类似accout based 系统的逻辑,方便一般使用者发送交易,却也让大家忽略UTXO 的潜力。事实上Ethereum 也可以用smart contract 达到类似的效果,增加匿名性,但毕竟他的底层还是以account 为单位,可以做到类似的逻辑,但隐私的层级还是有差异。
范例
我在Bitcoin mainnet用non-standard P2SH发了一笔交易,script逻辑是5 + 6 = 11,读者可以从explorer上查看这笔交易。
redeem script is 5 + 6 = 11
总结
其实Bitcoin 这种UTXO 的系统,搭配script language 的交易逻辑是相对比较复杂的,只不过多数交易只限缩在使用standard script,而Ethereum 的底层是较为简单易懂的account based 系统,接近现有银行机制,复杂的逻辑可以透过smart contract 来实现,两者设计方向不同,有不同的适用场景,也许account based 的逻辑容易被大众接受和使用,而Bitcoin 是许多密码庞克心中一个经典的尝试。
注:原则上目前miner 是不直接收含有non-standard script 的output,必须包装成P2SH 才可以被接受。
本文链接地址:https://www.wwsww.cn/btbwhy/5983.html 郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。