来源 | 《人人都懂区块链》
作者 | Carol
出品 | 区块链大本营(blockchain_camp)
* 听说文末有福利!
今天,想和大家聊聊编写智能合约这事儿。
不过,在讲编写智能合约之前,先说一个智能合约的故事。
绑匪、富豪和教父的故事
一个绑匪绑架了富豪的儿子。
教父是黑白两道通吃的大佬。
绑匪和富豪都相信教父。
富豪收到绑匪的电话后,特别担心给钱之后仍然救不了儿子的性命,而绑匪也担心放了人拿不到赎金。
两者相持数小时,富豪的儿子提出一个解决办法,让富豪设立一个三方交易的比特币钱包地址,该交易只有在绑匪和教父都用私钥签名后才有效,并且协议被全网广播后,绑匪必须马上放人。
作为一个自动担保账户,当情景满足规定条件时,程序就会自动释放或转 移资金。整个过程可以描述为:
富豪建立智能钱包;
绑匪用自己的私钥解锁;
仲裁者调用智能合约函数;
函数触发,将资金转移到合约当中,等待回调发生。
在这个故事中,仲裁者成功调用智能合约函数解决了富豪与绑匪的困境。由此,富豪与绑匪之间的不信任博弈从技术层面被破解了。那么与智能合约相比,传统合约又是怎么运转的呢?
传统合约的订立
传统上,合同的订立是指缔约当事人相互为意思表示并达成合意而成立了合同。合同的订立由“ 订”和“ 立”两个阶段组成。
“ 订”强调缔约的行为和 过程是缔约各方接触、洽商过程,包括缔约各方的接触、洽商并最终达成协议前的整个讨价还价过程。
此阶段由要约邀请、要约、反要约诸制度加以规范和约束,产生先合同义务及缔约过失责任。而“ 立”强调缔约的结果 , 指的是双方合意的达成,即双方当事人就合同条款至少是合同的主要条款已经形成一致意见,各方当事人享有的权利和承担的义务得以确定,简而言之,合同成立了。
实际而言,合约的“ 订”其实是要约,要约指一方当事人向他人做出的以一定条件订立合同的意思表示。前者称为要约人,后者称为受要约人。而要约的形式——要约作为一种意思表示,可以书面形式做出,也可以对话形式做出。书面形式包括信函、电报、电传、传真、电子邮件等函件。
要约的有效条件有以下三点。
要约必须是特定人的意思表示。
要约必须是向相对人发出的意思表示。要约的相对人应为特定的人,但在特殊情况下也可以为不特定的人。
要约必须是能够反映所要订立合同主要内容的意思表示。
而合约“ 立”这一阶段就是承诺,承诺指受要约人同意要约内容缔结合同的意思表示。承诺应以通知的方式做出,但根据交易习惯或要约表明可以通过行为做出的除外。缄默或不行为不能作为承诺的表示方式。
承诺的有效要件:承诺须由受要约人或其授权的代理人做出;承诺须在有效期内做出;承诺须与要约的内容一致;承诺须向要约人做出。所以,合同订立的一般程序应该如下。
当事人双方相互约定,双方当事人有合作意向后就合约的内容不断探讨交流,最后形成合作的一致意见。
合同起草。有了明确的合作意见后,就敲定合约的细节,由双方当事人或者第三方( 被双方所承认的)来着手合约的起草,完成合约的书面文本 后,由双方当事人确认合约细节,确认无误后方可。
专业人员评估。完成合约起草后,还需要合约有关专业人员( 如律师) 来确认合约本身的合法性,公证处对合同进行公证备案。
合同执行。合同执行主要靠当事人双方自觉执行,如出现违约等情况, 双方当事人应相互协商解决,协商后依旧无法解决的,可申请仲裁或上诉法 院,法院判决后强制执行。
智能合约的编写步骤
相比传统合约时效性受到诸多限制,智能合约则存在着诸多好处,签署效 率高,安全性强,且在违约执行时实现了不可抵赖和自动执行性。
那么,怎样编写一个智能合约来解决我们的问题呢?
一般而言,一个运行智能合约的去中心化平台会提供一条公有区块链,并会制定面向智能合约的一套编程语言。智能合约的开发者可以在该智能合约平台上 使 用 官 方 提 供 的 工 具 , 来 开 发 支 持 该 平 台 区 块 链 协 议 的 应 用 ( 即 所 谓 的 D A P P )。
因此,可以在智能合约平台上进行编写,具体的逻辑步骤如下。
第一步,启动一个区块链节点。
第二步,使用编程语言编译智能合约,然后将源代码编译获得二进制代码。
第三步,将编译好的合约部署到网络,获得合约的区块链地址和ABI 。(这一步可能会消耗费用,还需要使用节点的默认地址或者指定地址来给合约签名。)
第四步,用JavaScript API来调用合约。(根据调用的类型有可能会消耗费用)
实例分析一:以太坊智能合约编写
1. 安装以太坊的准备工作
如果是首次接触 Ethereum( 以太坊),推荐使用下面的步骤安装部署。
第一步,安装 Ethereum。
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum sudo add-apt-repository -y ppa:ethereum/ethereum-dev sudo apt-get update
sudo apt-get install Ethereum
第二步,安装 solc 编译器。
sudo add-apt-repository ppa:ethereum/ethereum-qt sudo add-apt-repository ppa:ethereum/ethereum sudo apt-get update
sudo apt-get install cpp-ethereum
安装后可以使用 geth 命令创建 Ethereum 账户。
geth account new
第三步,Solidity 语言支持。
Browser-solidity 提供了在线的 Solidity 语言测试。需要下载包括 Solidity 运行 环境的安装包。
第四步,安装客户端 Mist。
官方提供钱包客户端 Mist,支持进行交易,同时支持直接编写和部署智能合约。
所编写的代码编译发布后,可以部署到区块链上。使用者可通过 Mist 发送指令,调用相应交易合约,让以太坊虚拟机(EVM)在区块链上执行交易合约。
以太坊现在有多种语言实现的客户端,包括以下几种:
ethereumjs-lib:JavaScript 语言实现;
Ethereum(J):Java 语言实现;
ethereumH:Haskell 语言实现;
go-ethereum:Go 语言实现;
Parity:Rust 语言实现;
pyethapp:Python 语言实现;
ruby-ethereum:Ruby 语言实现。
2. 在以太坊上编程时的注意事项
完成准备工作后,就可以着手编写属于自己的智能合约。在编写过程中, 还有一些地方需要注意