新闻中心

从程序员角度解释什么是区块链的智能合约

投入区块链社群以及产业一小段时间了,跟工程师朋友们聊到区块链的去中心化架构时,朋友们多半是一头雾水。今天想试着透过工程师们比较容易理解的角度来解释一下区块链领域经常被提到的一个名词:Smart Contract (智慧合约或译作智能合约)。希望有助于工程师朋友们了解区块链技术。
先提醒一下以下的内容解释的都是针对 Ethereum (以太坊) 区块链,其他的区块链不见得有 Smart Contract 的概念。
一般的程序如何被执行?
开始解释 Smart Contract 前想来聊聊更基本的概念:一段程序是怎么被执行的。当你写了一段 Java、Python 或是 JavaScript 的程序,它是怎么被执行呢?假设我们在写一个卖票软件,可能会需要一个 MeetupEvent 的类别 (Class),内容如下:

这段 Java 程序的执行方式是:一般来说源码会经过 Java 编译器转译成Bytecode(字节码)之后,透过 JVM (Java Virtual Machine,java虚拟机) 在电脑中执行。当这个程序在执行时 main()方法时将会建立一个类的 instance event,此时这个 instance (实例)将会储存在内存里面,并且可以通过我们定义的方法如 register() 来操作这个 instance,直到整个程序结束。

不管是写 Java, Python, JavaScript 或其他较为高级的语言,语法细节根据不同程序语言会有差异,但是大致流程都是这样,相信工程师们对这样的运作架构也耳熟能详
Smart Contrac
让我们再回到我们的主题:什么是 Smart Contract 呢? Smart Contract 名字上听起来很玄,如果你是第一次接触区块链的工程师,其实:
Smart Contract 就是一个运行在区块链 VM 上面的 instance。
更精确地来说,在 Ethereum Blockchain 上面 Smart Contract 运作在 Ethereum Virtual Machine (EVM) 上面。同样的 MeetupEvent,我们改用 Smart Contract 的程序语言 solidity 重写一次:
在区块链上所有人都可以执行这个 smart contract 所拥有的函数 (function)。当然因为它就是一段程序,你也可以写些逻辑来做权限控管。以我们以这个程序做个例子,可执行的函式就是 register()。这样说起来,除了 Smart Contract 是跑在区块链上以外,其实他就是一个 instance,跟使用其他程序语言上的 class instance 没有太大的差别。
而区块链 VM 上跑的程序(也就是 Smart Contract)跟一般 VM 上跑的程序,最不一样的地方就在于去中心化架构。
去中心化
在一般程序的架构中,不管哪个服务用了分布式运算、load balance 加上多台服务器或是只在一台机器上面跑,本质上这些服务器(或说是运算单元)全部都是由单一组织掌管,这样的架构行之有年,也运作得很好。但这样的架构下,如果你需要做任何「价值交换」的应用,免不了都要中间人的介入。
在以前只能当面交易的年代,所有东西都是一手交钱一手交货。需要更方便与有效率的交易时,出现了掮客帮你转交物品跟金钱的行业,当然这位中间人需要取得双方的信任。
最终银行、信用卡公司、金流公司类似的概念逐渐兴起,使用者也需要信任银行或信用卡公司时,这样的模式才行得通,而搭建在上面的「信任」是国家透过合约、法律约束各式各样的公司,一层一层的信任关系就这样搭建起来。
你跟网路上的某人交易可以成功,其实背后是一层层的中间人与信任关系。
回到最根本之上,就是「信任」问题。而区块链与 Smart Contract 则是试图透过去中心化的架构来解决这问题。不同于一般程序的中心化架构,在Ethereum 区块链中,如果你想要透过协助别人执行他们的Smart Contract 获得奖励,你可以安装ethereum node 的软件如go-ethereum 或是parity,并且开启矿工模式即可。要成为一个矿工并不需要经过谁的同意,而当矿工在 Ethereum 区块链会有挖矿奖励回馈以及使用者给矿工的交易费。
如此一来 Ethereum 的去中心化节点网路就这样建构起来了。当你部署一个 Smart Contract,或是发起一笔交易来改变区块链内的状态时,会需要付出交易费,这笔交易费最终则会由矿工收走作为奖励之一。
更棒的是Ethereum 区块链是一个内建数字货币交易的平台,开发者可以非常容易的利用在区块链上内建的数字货币交易系统来搭建各式各样的去中心化应用(Decentralized app, Dapp)。你跟网路上的某人交易时,如果透过 Smart Contract 双方先押了一笔保证金在合约里面,是不是就可以在没有中间人担保的状况下让确认交易可以执行呢?内建数字货币交易系统,搭配上公开的 Smart Contract 内容(也就是源码),以前透过现实生活的「合约」来解决的信任问题,就可以重新思考是否可以透过 Smart Contract 解决。
话说回来,区块链跟 Smart Contract 都还在非常早期的发展,说不定现在发现的问题比解决的问题还要多。我不觉得区块链是银弹,突然之间就可以解决以往庞大复杂的问题。不过我真的很期待去中心化的思维可以回头来思考我们已经做过的服务,有哪些可以再透过去中心化架构,提出新的解决方案。