孟岩
渡鸦区块链专栏作者
16年初 IBM 跟三星合作搞了一个区块链概念验证项目,名叫 ADEPT。跟现在市面上五花八门的区块链项目相比,这个 ADEPT 最大的特色是强调“区块链+物联网”。当时 IBM 有个区块链专家声称,与物联网的结合应用将是区块链最具前景的发展方向。当我第一次听到这个说法的时候,其实我是拒绝的。因为我觉得,区块链的主要应用行业,逃不出金融、法律、公共服务等以“文字证据”为根本的领域。区块链本质毕竟只是一个记录本,它分布式也好,不可篡改也好,按时间戳串成链条也好,归根结底还是“文字纪录”的一种新的形式。把区块链跟物联网结合起来,还说是最具前景的方向,是不是吹得有点过猛了?
理解了智能资产之后,我才对这个问题有了一些认识。现在回过头去看 ADEPT 的一些愿景描述,可能不是过于浪漫了,而是过于保守了。如果将区块链当做价值交换的主干网络,那么智能资产将使区块链脱虚入实,触及物理世界,将各行各业以及日常生活的方方面面纳入这个价值交换网络,驱动交易高度自动化。
不但如此,如果将区块链和智能资产与现在炙手可热的人工智能联系起来考虑,更有意思。人工智能和机器人是追求增强机器的能力,而区块链和智能资产提供了一种依靠密码学和民主机制来控制机器的能力。如果我们的人工智能和机器人仍然以现有的软件开发方式来构造,那么未来世界最有权力的人将既不是高官,也不是巨富,而是黑客。虽然我们不知道黑客的统治是否一定就不如现在好,但如果大家不想尝试的话,至少区块链和智能资产为穿旧鞋走老路提供了一种可能性。
本文分几个部分介绍智能资产的概念、动机和技术方案。
1. 比特币:一种准智能资产
一切思路来自比特币,所谓智能资产,后来的学者延展也罢、创想也罢,其基本的思想就在比特币中。
当我说你有10枚比特币的时候,我是什么意思呢?
在《其实没有什么比特币,只有UTXO?》(点击蓝字复习下原文)一文中,我解释了,世界上并没有比特币,所谓比特币,其实就是 UTXO。也就是说,当前比特币系统里,所有收款人是你的 UTXO,它们的金额总和是10。
这些 UTXO 是你的资产,英文是 property 或 asset,两个词都有人用。
明确一下概念,这里所谓资产,不是《穷爸爸,富爸爸》里面所说的,你睡觉也能给你挣钱的资本(capital)。资产是一项权利,可以从以下三个特质来理解这里所谓的资产。
第一个特质,存在权威力量保障你对资产所拥有的正当处置权利。在现实生活中,你名下的房屋、汽车和电脑是你的资产,立法和执法机构作为权威力量保障你对于你的房屋、汽车和电脑的正当处置权利。如果有人侵犯这个权利,比如不经你的同意开走你的车,或者没有其他合法理由阻止你使用你的电脑,那么就构成对你资产处置权的侵害,你就可以要求执法机构强制他停止对你的侵害甚至惩罚他。相反,如果没有权威力量来保障你的处置权,那么这就不是你的资产,占你大屋夺你田,你又能怎样?
第二个特质,资产必须可交易,不能交易的不是资产。你的精神状态,你的微信和微博账号,它们无疑都属于你,而且它们很对你重要。你可以任意处置它们,如果有人给你造成精神损失,或偷窃你的账号,你可以请求法律或者去微信微博投诉,要求主持公道。但它们都不是资产,因为它们无法交易。
第三个特质,在任何一个时刻,资产的所有者范围必须明确,一个人要么是这个资产的所有人,要么不是,必须清清楚楚。因此,一本纸质书是资产,但一本被随意共享的电子书、一篇不禁止他人转载的网文,一份开源软件,它们就不是资产,因为随时都可能会有新的读者或者用户下载和拥有它。
比特币,或者说 UTXO 满足上面的三个要求。你的 UTXO 处置权利归你,由密码学和比特币网络作为权威力量保障这一点;UTXO 可交易;UTXO所有者范围明确,只能是一个人。所以 UTXO 是资产。
但是 UTXO 不是普通的资产,它具有一定的智能。
如果你想看看 UTXO 的具体长什么样,可以在浏览器地址栏里输入:
https://blockchain.info/unspent?active=1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX
然后就可以看到1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX这个地址所拥有的所有 UTXO。数据是以 JSON 格式表示的,我的 Chrome 浏览器安装了 JSONView 插件,所以能够以看得比较清楚:
上面列出了两个 UTXO 数据样本,我们可以看到,一个 UTXO 是一个数据结构,其中关键的字段有:
�tx_hash:代表输出这个 UTXO 的那个交易的哈希值(HEX编码);
�tx_output_n:代表在这个交易的若干项输出里,这个 UTXO 是第几项;
�value:这个 UTXO 的金额,单位是“聪(Satoshi)”,一聪相当于一亿分之一比特币
�script:锁定脚本哈希值(HEX编码)。这是一个神奇的字段,这个字段是通向智能资产的大门。我们马上将要详细讲述它的神奇之处。
之所以说UTXO 是智能的,是因为它有两个特点:
第一,UTXO 是自描述的,它跟你刚刚买回来的汽车不一样,新车本身没有任何标记或者数据描述其资产归属信息,之所以这辆车属于你,是因为你在这辆车之外完成了一系列手续,拿到了车钥匙。同样,某人银行账户里的余额,比如 250 元,这个数字本身也不是自描述的,它之所以属于户主,是因为银行系统把它放在那个户主的数据行里,它的命运和归属完全听任外界的摆布。UTXO 不一样,它来自哪里,金额多少,当前属于谁,要处置它时必须满足什么条件,都清清楚楚写在那里。
第二,UTXO 中包含一个智能合约,当有人需要处置它时,它要求这个人履行智能合约中的条款。或者换一个说法,UTXO能够自动的保障所有者的权益。
因为这两点,UTXO 就成为具有一定智能的资产,我称之为准智能资产。为什么是准?这需要跟真正高级智能资产作对比才能够体现出来,容后再议。
UTXO 为何可以自动保障所有者权益?因为它内含了一个智能合约。而所谓智能合约,全部神奇法门就在 UTXO 的 script 字段上。
懂编程的人都知道,script 是脚本程序的意思,也就是说,这个字段其实是一段程序。那么是一段什么样的程序呢?
这个字段又被称为“锁定脚本(locking script)”,或者“负载(encumbrance)”。也就是说,任何人想要动用这个 UTXO 资产,必须执行这个脚本,过得了关才能动用,过不了关你就别想。也因此,这个执行这个脚本成为动用这个 UTXO 资产的“负载”。
如果我们一般人来设计一个支付系统,收款人无非就是一个账户信息。所以如果中本聪也是像银行系统、支付宝、PayPal、微信支付的设计师那样考虑问题,那 UTXO 应该有一个字段叫 recipient_address (收款人地址),而不会有一个script字段。
但如果这么设计会带来两个主要问题。
一个是基于账户的数据库与比特币去中心化目标之间的矛盾,这在《UTXO高在哪里》一文中已经详细讨论过。
另一个是冒名顶替的问题。一个 UTXO 声明,只有地址为1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX 的用户可以使用我,但是它怎么知道谁是这个地址的真正拥有者呢?任何人都可以举着这个地址说:“我就是1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX,请把这笔钱给我!”这当然不行。
一个直观的思路是让提款人证明自己确实是地址的所有人,这很容易想到,在密码学里有多个方式可以做到验明正身,比如数字签名。
比特币里的地址其实是收款人公钥的哈希值前面加一个0x00 字节,后面加4字节的校验和。整个地址以 Base58 编码。
Address = Base58(0x00+RIPEMD-160(SHA256(PublicKey))+checksum)
上面列出的那个地址 1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX,如果把它解码为 HEX 编码,是这样的:
008c7e252f8d64b0b6e313985915110fcfefcf4a2d675f6d4e
中间绿色的20个字节,就是这个地址所有者公钥的哈希值。
这样思路就有了,提款人若想证明自己是改地址的拥有者,需要做两步:
第一步,出示一个公钥,其哈希值等于8c7e252f8d64b0b6e313985915110fcfefcf4a2d
第二步,用公钥的私钥对某个消息进行一个数字签名,让别人来验证你确实是哪个公钥的所有者。
这个证明当然是一个过程,或者说一段程序的执行过程。为此中本聪设计了 script 机制,为智能合约和智能资产打开了一扇大门。
上面的这个证明过程就是由 P2PKH 脚本完成的,P2PKH代表“Pay-to-Public-Key-Hash”。其作用就是付款人把这个 UTXO 所含有的比特币支付给收款人。这种脚本是中本聪原始设计,在全部 UTXO 脚本中占绝大多数,据统计大约 99.7% 的 UTXO 脚本都是 P2PKH。搞懂了 P2PKH,就基本能理解理解智能合约和智能资产。
比特币的脚本语言是特别为比特币的应用定制的语言,与我们熟悉的编程语言相比,它有两个最大的不同点。第一,它是一个基于栈的语言,也就是说,它没有一般意义上的内存,所有的操作数都只能分配在栈上,类似古董语言 Forth。第二,它不是一个图灵完备的语言,特别是它不支持循环。这主要是出于安全的考虑。一个语言一但有了循环,那么它的安全模型就非常复杂,比如你可以很容易的写一个死循环,把整个比特币网络卡死。
比特币脚本语言预留了 256 个指令,下面是一些指令例子:
OP_IF,编码为0x63,这个指令会检查栈顶的值是否为 true,如果是则执行后面的语句
OP_DUP,编码为 0x76,首先弹出栈顶元素,复制它,然后将它和它的复本一同压入栈。
OP_DROP,编码为 0x75,弹出栈顶元素然后抛弃
OP_HASH160,编码0xa9,首先从栈顶弹出元素,然后先用 SHA-256,再用 RIPEMD-160 进行两次哈希求值,然后将得到的哈希值压回栈
OP_EQUALVERIFY,编码 0x88,首先比较栈顶的两个元素是否相等,如果相等就继续往下走,不相等就标记此交易非法,然后中断执行
OP_CHECKSIG,编码 0xac,首先对整个交易的数据求哈希值,然后弹出栈顶的元素,将其作为PublicKey 对这个哈希值进行数字签名,将得到的数字签名与栈顶的元素对比,如果相等则返回1,不相等则返回0
在刚才我们取到的 UTXO 里,以HEX 编码的 script 字段的值是:
76a9148c7e252f8d64b0b6e313985915110fcfefcf4a2d88ac
这个脚本翻译成比特币 script 语言就是:
OP_DUP
OP_HASH160
0x14
8c7e252f8d64b0b6e313985915110fcfefcf4a2d
OP_EQUALVERIFY
OP_CHECKSIG
这份 UTXO 已经准备好了,等着他的主人来花掉他。
等到主人(地址1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX的拥有者)要花这笔钱的时候,他做这么几件事情:
第一步,用自己的私钥,对包含这个 UTXO 的整个交易数据(通常是几百字节)进行签名,得到 Sig,压入栈;
第二步,把自己的公钥 PubKey 压入栈;
第三步,执行 OP_DUP指令,如前所述,这个指令将栈顶的 PubKey 复制一份,再压入栈,这样栈顶就有两个 PubKey 了;
第四步,执行 OP_HASH160指令,弹出栈顶的 PubKey。求哈希值 PKHash,压入栈,注意此时栈顶元素是 PKHash;
第五步,执行 0x14,这个指令是告诉系统,把随后的 0x14,也就是20个字节压入栈。于是系统将 8c7e252f8d64b0b6e313985915110fcfefcf4a2d 压入栈;
第六步;执行 OP_EQUALVERIFY 指令,这个指令弹出并比较栈顶的两个元素。注意这时栈顶的第一个元素是8c7e252f8d64b0b6e313985915110fcfefcf4a2d,第二个元素是 PKHash。如我刚才所说,这两个值必须相等,才表明提款人确实出具了正确的公钥。也就是说,提款人出具的公钥,与这比 UTXO 收款人的地址对上了。如果没对上,那么久中止执行,提款失败。
第七步,执行 OP_CHECKSIG 指令。此时栈里还有两个元素,顶上那个是 PubKey,下面那个是 Sig。OP_CHECKSIG 指令用 PubKey, Sig和整个UTXO所在交易数据进行签名验证,成功则返回1压入栈,失败则返回0 压入栈。
第八步,整个系统判断,如果最后栈里留下的值是1,验证通过,用户可以提款。如果是0,验证失败,用户不能提款。
我知道这段繁复的解释是没有人看得进去的。事实上,我即便在对着有图解的说明时,也从没有认真理解过这八步过程。我真正彻底理解这个过程,就是在写这篇文章的时候。所以如果你读不明白,也没有关系。重点不是要理解这个过程,而是要从概念上明白:
比特币就是UTXO,UTXO 包含一段程序,这段程序确保了任何企图动用 UTXO 的人都必须满足一些条件。因为有了这段程序,UTXO 不再是普通的资产,而成了具有一定自主性、对主人忠心耿耿的忠犬资产。
然而我还不认为 UTXO 就是真正的智能资产,因为它还缺乏两个关键点,第一是没有将所有权与使用权分开,第二是它本身没有程序的执行能力,不能够主动维权。
如果有这两个特点,那么就将成为全功能的智能资产了。
请看下集。
作者简介:孟岩([email protected])
全球最大开发者社区CSDN 副总裁
原IBM大中华区高级经理
渡鸦区块链专栏作者
从2015年开始研究区块链技术及密码学,对银行票据、电信、艺术品、供应链、可再生资源等行业的区块链应用进行过实质性探索。
2009年入职 IBM大中华区,负责IBM区块链、智慧地球、智慧城市、Watson认知计算等重大技术战略在中国的实施和推广,所直接策划和参与的智慧地球、智慧城市、IBM百年、中国网球公开赛大数据分析、巴西世界杯认知计算等传播项目在国际和国内屡次获得行业大奖。
曾担任CSDN总编多年,熟悉和了解全球顶尖的程序员开发者。