1. 区块链世界的“代码悖论”
代码曾经是自由的,越优秀的代码越自由,就如越好的语言扩展性越强一样,然而一旦在代码中添加区块链概念,就实现了不可篡改性。既然代码不可篡改,就必须保证代码没有漏洞。可谁敢保证自己没有错误呢?这真是一个难题。
如果说信任的机器是区块链的躯干,共识机制是区块链的灵魂。无论是躯干还是灵魂,在区块链的世界里最终都是由代码构成的,那么,代码就相当于是区块链的DNA了。
在现实世界中,法律作为一种配置社会资源的机制,被社会经济发展的客观要求所决定,并直接影响着经济运行的全部过程。随着社会分工细化和人类活动范围日益扩张,法律逐渐变成国家制度框架下加以确认的一套格式化规则体系,它能够简化社会关系的复杂程度,节约交易成本,帮助社会成员安全、规范、有序地进行交易。不管是基于社会契约论、功利主义论、暴力威慑论还是法律正当论,法律的约束力都从未突破人的自我意志。
也就是说,在现实世界中,法律的解释是多样的;而在区块链的世界中,代码的解释则是唯一的。
图5-1所示的是一个交易输出(Transaction)过程,其解释是比较确定的,即来自“14c5f88a”账户向“bb75a980”账户的价值为10的转账,该交易的标记(交易哈希)为30452fdedb3df7959f2ceb8a1。两个交易账户余额变化显而易见,“14c5f88a”交易前余额为“1024 eth”,交易后为“1014 eth”;“bb75a980”原有“5202 eth”,交易后为“5212 eth”。由代码完成的交易输出其解释唯一,没有歧义。
2. 法律的本质是“合约”
现行法律的本质是一种合约,它是由(生活于某一社群的)人和他们的领导者所缔结的一种关于彼此该如何行动的共识。个体之间也存在着一些合约,这些合约可以理解为一种私法,相应地,这种私法仅对合约的参与者生效。
合同的概念可以追溯至远古时代,古希腊人和古罗马人认为,合同是解决信任、透明度和执法问题的正式协议,如市场交易合同、企业组织生产经营活动的各种内部规章及其他一些契约关系。
目前,主要依靠当事人的忠实履约或第三方来保障合约实行。在具体操作过程中,合约会面临着一系列成本,例如,交易双方在要约与承诺阶段因大量的谈判而发生的签约成本;合同签订过程中,双方还可能根据不同的情况对合同条款进行修改、补充以使合同更加完备而产生的修约成本;合同的维护和执行过程中发生的履约成本等。
例如,你和一个人订立合约,借给他一笔钱,但他最后毁约了,不打算还这笔钱,此时你多半会将对方告上法庭。可打官司这种事情充满了不确定性,通常情况下,将对方告上法庭,意味着你需要支付高昂的费用聘请律师,帮你在法庭上展开辩论,这一过程大多旷日持久。即使你最终赢得了官司,也可能会遇到一些问题(如对方拒不执行法庭判决)。而对你比较有利的是,当初你和借款人把条款写了下来,订立了合约。
但法律的制定者和合约的起草者们都必须面对一个不容忽视的挑战:在理想的情况下,法律或合约的内容应该是明确而没有歧义的,但现行的法律和合约都是由语句构成的,而语句,则是出了名地容易出现歧义。
3. 合约:区块链世界的“法律前置”
一直以来,现行的法律体系都存在着两个巨大的问题:第一,合约或法律是由充满歧义的语句定义的;第二,强制执行合约或法律的代价非常大。
而随着区块链技术的诞生,这些问题将以更友好的方式解决。由代码组成的区块链技术基于法律框架,通过预设自动执行的智能代码合约在约束并引导人们的行为时引入技术,依靠技术使信息更加透明、数据更加可追踪、交易更加安全,大大降低了执行成本。从某种意义上来说,这是一种“ 法律前置”,有点《少数派报告》电影的味道。
在区块链世界中,由代码构成的智能代码合约形成了区块链的“ 自规则”——区块链中的法律。换句话说,代码即法律。
代码对应语言中的文字,但不同于文字的多释义,代码的含义具有唯一性。代码作为一种核心工具,可以用它来构筑并保护我们最基本价值理念的网络空间,同样也可以用代码使其消失殆尽。斯坦福的劳伦斯·莱斯格(LawrenceLessig)教授在《代码》一书中反复强调:基于代码的软件或协议能够像任何法律规则一样规管我们的生活。
互联网的基础架构就是TCP/IP协议a,这个协议规定数据包是在网络中进行传输和交换的。
就是这个简单的协议,保证了互联网的迅猛发展。因为,它没有试图在基础的网络架构里加入太多的东西,如安全和控制等,从而保证了基础架构的简单和灵活性。互联网的这种架构,让创新在网络的边缘节点来进行,从而有很多的创新应用得以被发明出来。
如果当初按照AT&T(美国电话电报公司)的想法来规划互联网,那么互联网将不会像今天这样了。作为一个企业,AT&T必然会在基础架构里加入很多功能和控制,并会对边缘节点的接入应用进行限制,那样的互联网就不会像今天这样开放和自由。
一开始是美好的,控制着整个互联网的核心运作的就是TCP/IP协议,它是严格执行这个协议的程序代码。在计算机网络世界里,所有的规则定义是以代码来实现的。
然而发展的路径却并不是由程序员说了算:第一代架构是由非商业组织研究者和黑客建立的,他们关注于如何建立一个网络;第二代架构则是由商业建立的;第三代架构已经是政府的作品。现实社会的法律开始作用于网络空间,代码越来越不是法律,反而法律开始影响网络的架构,开始影响虚拟世界的一行行代码。为了维护网络空间的稳定,网络实名制被提上议程,新发的帖子需要通过关键词审查;为了网络纯洁,图片需要改变外链规则。在网络空间内,代码实现了法律所需要的效果,“法律”化身为代码。
不过,到了区块链时代,它区别于传统互联网,有着自定共识规则和自动实施规则的能力。区块链技术可以通过技术方法落实契约原则,解决信任问题。这是契约的前置,信任的锁定,法律的嵌入,社区的共识。每一笔交易都透明公开,通过共识协议和可编程的智能代码合约形式,可以建立互信、创造信用,制定和执行交易各方认同的商业条款,引入法律规则和监管控制节点,确保价值交换符合契约原则和法律规范,避免无法预知的交易风险。
谁要改变这样的代码就是与整个社区为敌,代码就是法律。
4. 代码实现哈希值的计算
我们知道,比特币使用哈希加密算法来维护信息的安全性,那么代码要如何实现这一过程呢?
以Pythona语言为例,首先,打开终端,输入“Python”并按【Enter】键,然后将进入Python REPLb,在这种环境下,可以直接使用Python命令,而不是在单独的文件中编写程序。最后输入以下数值,在每行之后按【Enter】键,并在标记处输入“TAB”,如下所示:
import hashlib
def hash(mystring):
[TAB] hash_object = hashlib.md5(mystring.encode())
[TAB] print(hash_object.hexdigest())
[ENTER]
这样就创建了一个函数——Hash( )。该函数将计算出某一特定的使用MD5哈希算法的字符串的哈希值。将字符串插入上述的括号中便可运行该函数。例如:
hash(liangzixuepai)
按【Enter】键并查看该字符串的哈希随机值:
e4b9cb27e1fa5e644dc53e20de8c108f
如果改变这串字符,会发生什么呢?是哈希值的微小变化还是什么?
hash(”liangzixuepai”) => e4b9cb27e1fa5e644dc53e20de8c108f
hash(”lianzixuepai”) => 8a76b8bce8a03603003f23cce0e1b034
你将看到,在同一字符串上,调用该哈希函数将总是生成相同的哈希,但添加或改变其中的某一个字符,将会生成一种完全不同的哈希值。
代码实现了哈希函数的运行,在区块链中,通过代码就可以计算哈希值,基于哈希算法的数字加密也才得以更好地进行。
5. 基于代码编程的区块链
想要区块链自规则能够完整运行,少不了代码的编程。下面从代码的角度实际讲一下如何形成一个完整的区块链。
① 逻辑步骤决定区块结构。
为了保证事情尽可能简单,我们只选择最必要的部分:Index(下标)、Timestamp(时间戳)、Data(数据)、Hash(哈希值)和Previous Hash(前区块哈希)。如图5-2所示。
② 确保区块链的这个块中必能找到前一个块的哈希值,以此来保证整条链的完整性。代码如下:
class Block {
constructor(index, previousHash, timestamp, data, hash) {
this.index = index;this.previousHash = previousHash.toString();
this.timestamp = timestamp;
this.data = data;this.hash = hash.toString();
③ 哈希加密。这里采用的是SHA-256 算法(上面所用的是哈希MP5 算法出来的散列值),为了保存完整的数据,必须用哈希计算整个区块。SHA-256会对块的内容进行加密,记录这个值应该和“ 挖矿”毫无关系,因为这里不需要解决工作量证明的问题。其代码如下:
varcalculateHash = (index, previousHash, timestamp, data)
=> {
return CryptoJS.SHA256(index + previousHash + timestamp +
data).toString();
};
④ 块的生成。要生成一个块,必须知道前一个块的哈希值,然后创造其余所需的内容(= Index, Hash, Data and Timestamp)。块的Data部分是由终端用户所提供的。代码如下:
vargenerateNextBlock = (blockData) => {
varpreviousBlock = getLatestBlock();
varnextIndex = previousBlock.index + 1;
varnextTimestamp = new Date().getTime() / 1000;
varnextHash = calculateHash(nextIndex, previousBlock.hash,
nextTimestamp, blockData);
return new Block(nextIndex, previousBlock.hash,
nextTimestamp, blockData, nextHash);
};
⑤ 块的存储。内存中的JavaScripta数组被用于存储区块链。区块链的第一个块通常被称为“起源块”,是硬编码的。
vargetGenesisBlock = () => {
return new Block(0, “0”, 1465154705, “my genesis block!!”,
“816534932c2b7154836da6afc367695e6337db8a921823784c14378ab
ed4f7d7″);
};
var blockchain = [getGenesisBlock()];
⑥ 确认区块完整性。在任何时候,都必须确保一个区块或者一整条链的区块的完整性能够被确认。在从其他节点接收到新的区块,并需要决定接受或拒绝它们时,这一点尤为重要。
用代码表现为:
varisValidNewBlock = (newBlock, previousBlock) => {
if (previousBlock.index + 1 !== newBlock.index) {
console.log(’invalid index’);
return false;
} else if (previousBlock.hash !== newBlock.previousHash) {
console.log(’invalid previoushash’);
return false;
} else if (calculateHashForBlock(newBlock) !== newBlock.hash) {
console.log(’invalid hash: ‘ + calculateHashForBlock(newBlock) + ‘ ‘ + newBlock.hash);
return false;
}
return true;
⑦ 选择下一个链。任何时候在链中都应该只有一组明确的块。万一出现冲突(例如,两个节点都生成72号块时,如图5-3所示),前面的主干区块链会选择有最大数目认同的链。
varreplaceChain = (newBlocks) => {
if (isValidChain(newBlocks) &&newBlocks.
length>blockchain.length) {
console.log(’Received blockchain is valid. Replacing
current blockchain with received blockchain’);
blockchain = newBlocks;
broadcast(responseLatestMsg());
} else {
console.log(’Received blockchain invalid’);
⑧ 节点控制。某种程度上,用户必须能够控制节点。这一点可以通过搭建一个HTTP服务器实现。代码如下:
varinitHttpServer = () => {
var app = express();
app.use(bodyParser.json());
app.get(’/blocks’, (req, res) =>res.send(JSON.stringify
(blockchain)));
app.post(’/mineBlock’, (req, res) => {
varnewBlock = generateNextBlock(req.body.data);
addBlock(newBlock);
broadcast(responseLatestMsg());
console.log(’block added: ‘ + JSON.stringify(newBlock));
res.send();
});
app.get(’/peers’, (req, res) => {
res.send(sockets.map(s => s._socket.remoteAddress + ‘:’ +
s._socket.remotePort));
});
app.post(’/addPeer’, (req, res) => {
connectToPeers([req.body.peer]);
res.send();
});
app.listen(http_port, () => console.log(’Listening http
on port: ‘ + http_port));
};
至此,一个区块链世界已经创建完成,在短短两百多行代码中,这个数字世界的法律被建立,“代码即法律”得到了完美的诠释。
但值得注意的是,以上的代码只是最简单的一种代码架构,像比特币和以太坊的代码经过这么长时间的发展,已经发生了一些变化,它们要复杂得多,架构肯定也完整得多。
6. 区块链世界法律架构的确立——以以太坊为例
以太坊(Ethereum)通过数字货币和编程语言的结合,为用户提供了一个智能合约编写平台,用户能够以智能代码合约为底层系统确定自己区块链世界的“法律”。
以太坊的智能合约由一个完整的编程语言构成,有时也被叫作以太脚本(EtherScript)。代码语言是人类用来控制计算机工作的,而反过来,计算机则无法猜透人类的意图,因此,用任何代码语言写好的指令,对计算机来说都准确无误、没有歧义。也就是说,计算机执行一段代码不存在歧义,除非是代码编写出了问题。在同样的条件下,这段代码总是会按照既定的步骤执行,这种特性正是人类现行法律与合约中所缺失的。有了以太脚本之后,就可以建立具备这种特性的合约。
考虑大部分的合约都涉及经济价值的交换或具有某种经济后果,因此可以在以太坊上用代码实现人类社会中各式各样的法律与合约。用代码实现合约,可以有严格明确的定义,并且可以自动被执行。
这样说有些晦涩难懂,还是一起来看个简单的例子吧。
假如你有一个青花瓷古董,小明想以8888元的价格购买这个青花瓷,同时小明承诺会在5月付款。按照传统的交易流程,首先你会与小明签订一个合约,合约里会详细写明:小明将在5月向你付款。合同签订完毕,你就将青花瓷交到小明手里,等小明5月给你付款。等到了5月,按照你对合约的理解,小明应该付款了。可当你要求其履行合约时,小明表示他约定的5月指的是明年5月,而不是今年5月。这个时候,你就只能花钱请律师,和小明去法庭上好好讨论一下合同里的“5月”到底是何年何月了。
而如果基于以太坊,你完全可以用以太脚本定义出如图5-4所示的“智能代码合约”,这份合约,人和计算机都可以读懂。
一开始就读懂上图所示的代码合约可能要花点时间(如果你不是一名程序员的话),但一旦学会如何阅读,这份代码合约绝对比现有的律师起草的合约要通俗易懂得多。
在图5-4中,合约先确定了你和小明的身份(你为卖家,小明为买家),并直接说明这场交易通过价值8888元的以太币来进行。在区块链世界,代表身份(即账户地址)的是一串哈希字符值,因而交易双方需要在以太坊区块上确认彼此身份。合约定义了买家(小明)的以太坊账户地址为“6af26739b9ffef8aa2985252e5357fde”,同样定义卖家(你)的以太坊账户为“feab802c014588f08bfee2741086c375”。双方确认身份无误后,合约内容就是2018 年4 月1 日,以太坊输出价值8888 元的以太币和青花瓷所有权,买家在收到青花瓷后立即支付价值8888 元的以太币。合约经过平衡函数调试后最终确立,2018 年5 月1 日自动执行。
以上合约清晰明了,如果采用这种方式,一般的用户就可以起草简单的代码合约,特殊一点的代码合约可能需要稍微资深一点的专家(就像复杂的传统合约也需要专门的律师起草一样)。作为结果,我们得到的这份合约完全消除了类似“我认为,你认为”的这种误解,缔约双方是否依法履约的不确定性也一并被消除。
也就是说,代码脚本写成的这份合约,既定义了合约内容,又保证了合约内容的执行。
本质上而言,由代码构成的合约是一个无歧义且无法毁约的合约,只要双方都认同合约,那么合约就一定会执行,不管其中是否有人想毁约或者提出歧义,代码就是最好的语言,代码的自规则将自行运转,是不以人的主观意志为转移的机器法律。
7. 结语:代码即法律
法律作为一种社区共识,是以人性作为起点,以道德作为基础,以利益作为条件,以暴力作为信用而形成的一个“合约”,但这个“合约”很容易在高收益的诱使下被破坏,然后违约者被发现后才会受到法律制裁,这是一种“过去式”惩罚机制。
而区块链代码是一种“内在的”规则,为软件代码定义的对应的算法运算规则,如果不遵守代码的运行机理,程序将返回一个error(错误)并停止运行,这是一种“进行时”执行机制。代码所组成的“进行时”机制从根本上保证了整个规则体系的运转,如果代码无漏洞,该体系就无法被打破。
因此,代码意味着规则,区块链世界的宪章就是代码,代码即法律。
当然,最后的区块链世界会不会和互联网世界一样仍然由法律来主宰代码,谁也无法预测。
有时候,我们低估了技术的力量,也高估了人性的底线。
但由于区块链技术的介入,如果想要修改区块链世界宪章,那将是一场更激烈的战争。
文末思考题
司法解释是宪法赋予法官和审判组织的司法权,由于每个法官对法律条文或多或少会掺杂一些个人的理解,因此就会出现一些谬误。在区块链技术产生之后,有人认为,将现有法律转换成代码就可以实现法律的一致性,就不会出现歧义,法律也能很好地执行,你赞同这样做吗?为什么?