维基上说智能合约(英语:Smartcontract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由NickSzabo首次提出。智能合同的目的是提供优于传统合同方法的安全,并减少与合同相关的其他交易成本。+ _" [! r( i: V
由于区块链上的所有用户都可以看到基于区块链的智能合约。这也会导致包括安全漏洞在内的所有漏洞都可见,并且可能无法迅速修复。这样的攻击难以迅速解决。* Y5 d* @- X( j
插曲,2016年6月TheDAOEther的漏洞造成损失5000万美元,而开发者试图达成共识的解决方案。DAO的程序在黑客删除资金之前有一段时间的延迟。以太坊软件的一个硬分叉在时限到期之前完成了攻击者的资金回收工作。以太坊智能合约中的问题包括合约编程Solidity、编译器错误、以太坊虚拟机错误、对区块链网络的攻击、程序错误的不变性以及其他尚无文档记录的攻击。
3 E. F; G" D& F3 j e& l# a8 D. g9 S' ]
部署智能合约的经典案例有:# {1 p& l: s& n' Q
. x: S# \- Q( S" w1 \* A
以太坊在其区块链上实施了一种近乎图灵完备的语言,这是一个突出的智能合约框架。RootStock(RSK)是一个智能合约平台,通过侧链技术连接到比特币区块链。RSK兼容为以太坊创造的智能合约。/ z; m9 t3 @, K, M$ Z
一个典型的智能合约的solidity语言编程示例或者叫实例如下一个委托投票系统,做了一些备注:
官网示例原文3 F& W: O4 W# ]5 R7 _9 ]
9 h+ @$ S9 D% x$ F3 g, {+ \& [0 w; [
这个例子是最新的,主要用到了以太坊编程语言Solidity的一些特性。例子实现了一个投票智能合约即电子投票系统。解决的主要问题是如何分配合理的权限给正确的人,并且要防止被篡改。这个例子实现了如何去委托投票,整个投票计数过程是自动而且完全透明。
" }! Q- Q$ Q+ }
功能上它首先为投票创建一个合约,发起者作为所谓的chairperson姑且叫主席来给每一个独立的地址分配相应权限。每一个参与投票者可以自己投票或者委托自己信任的人。这段代码最后运行结果会返回得票数最多的那个议案或者叫倡议。# k/ i) V1 o5 U8 {7 j G1 M
- pragma solidity ^0.4.22;# Q8 V& J; H0 I7 Z6 L
- /// @title Voting with delegation.一个有委托功能的投票系统
- contract Ballot {
- // This declares a new complex type which will 定义一个复杂类型
- // be used for variables later. 后面作为变量来使用8 V" i6 P+ u2 e+ O
- // It will represent a single voter.代表一个投票人
- struct Voter {
- uint weight; // weight is accumulated by delegation weight在代表投票过程中会累积: I& L8 O: `: n" N: {8 `, J
- bool voted; // if true, that person already voted 如果值为true,代表这个投票人已经投过票 _6 ?6 ~/ ?! N2 \" w, d; Z
- address delegate; // person delegated to 投票人地址
- uint vote; // index of the voted proposal 当前投票的索引
- }( P5 N( d$ Y& T9 x1 o9 D3 }8 W
- // This is a type for a single proposal.代表一份议案的数据结构
- struct Proposal {
- bytes32 name; // short name (up to 32 bytes) 议案的名称" B+ a4 B( j6 b( M
- uint voteCount; // number of accumulated votes 议案接受的投票数
- }
- address public chairperson; // 定义投票发起人' ?' e3 W- z* \* f1 R
- // This declares a state variable that
- // stores a `Voter` struct for each possible address. 这个状态变量存储了所有潜在投票人
- mapping(address => Voter) public voters;
- // A dynamically-sized array of `Proposal` structs. 定义动态数组存储议案- M! Z8 P% E4 u7 B' N
- Proposal[] public proposals;
- /// Create a new ballot to choose one of `proposalNames`. 传入议案名称来定义一个投票对象
- function Ballot(bytes32[] proposalNames) public {
- chairperson = msg.sender;& v% i$ ~4 Q6 G/ E/ W2 j
- voters[chairperson].weight = 1;
- // For each of the provided proposal names,3 N4 [+ c! }$ _0 u9 [. x; o
- // create a new proposal object and add it
- // to the end of the array. 按传入的议案名称创建一个议案,并加入到前面定义的议案数组
- for (uint i = 0; i winningVoteCount) {
- winningVoteCount = proposals.voteCount;; Z0 J' J. A& M+ j) E# N
- winningProposal_ = p;
- }2 u8 d3 G' f2 g Y
- }' ~0 M3 A3 d: K# @
- }
- // Calls winningProposal() function to get the index
- // of the winner contained in the proposals array and then
- // returns the name of the winner
- function winnerName() public view `7 S# ^- O' U; U
- returns (bytes32 winnerName_)
- {
- winnerName_ = proposals[winningProposal()].name;4 O* r$ t8 U1 w7 x% p( ~
- }/ C# f" u2 T0 H# _! `* Y z
- }