基于以太坊ICO的安全合约架构

基于以太坊ICO的安全合约架构

概述

随着比特币、以太坊的崛起,通过ICO来筹集早期资金的项目越来越多。其中,大多数项目都采用基于以太坊的ERC20 token来发放代币。以ERC20 token为标准的代币占据了数字货币市场的半壁江山,从而支撑了以太坊的价格上涨。

以太坊合约的图灵完备性给ICO带来极大自由度和便利的同时,也让ICO安全备受关注。综合来看,通过合约来控制ICO流程时需要解决的几个问题如下:
* 代币如何创建,由谁来创建?
* 如何在众筹过程中创建代币?
* 用户转入的ETH如何控制?

带着以上几个问题,想要了解基于以太坊ICO的技术细节,我们接着往下看。

ERC20 Token

ERC20 token是以太坊平台上的数字货币标准,本质上是一种智能合约。使用ERC20 token的优势是:
* 众筹过程公开透明
* 众筹规则可控
* 交易时间可控

以上几个特性,都是基于以太坊的图灵完备性,通过合约来控制的。

众筹合约框架

考虑到整个ICO过程的可控性、安全性、以及监管等要求,ICO过程会涉及到三个合约:众筹合约ERC20 Token标准合约钱包合约 ,以及用于创建这三个合约的主账号
* 主账号
主账号是普通的以太币账号,负责创建三个合约
* 众筹合约
控制众筹时间,总量,发起创建代币

  • ERC20 Token标准合约
    除了具备代币最基本的转账、余额功能之外,为了能够在众筹时初始化代币,该合约还有创建代币的功能(只有众筹合约才能创建代币)。

  • 钱包合约
    用于接收众筹到的ETH。此外,还可以根据具体需求设置钱包的锁定时间,每日取款限制,多重签名等

为了方便描述四者之间的关系,这里用C代表众筹合约,用T代表ERC20 Token标准合约,用W代表钱包合约,用M代表主账号。它们的关系如下图所示:

操作流程

流程说明:
1. 创建合约: 通过主账号M分别创建三个合约C、T、W,此时三个合约的所有者owner均为主账号M。(一些比较敏感的操作只有owner才有操作权限)
2. 切换T的owner: 为了让众筹合约能够分发代币,需要将代币合约T的owner换成众筹合约C。(只有完成了这一步操作,后续操作才能够促发)
3. 分发代币: 用户参与众筹时,将以太币转入众筹合约C,C会根据规则计算出需要发放的代币数量,通过调用代币合约T的生成代币接口,给该用户分发代币
4. ETH转存: 分发代币的同时,会将用户转如的以太币转存到事先设置好的钱包合约W中(钱包合约有自己的提款规则)

安全性

整个ICO流程看起来比较复杂,但是复杂的背后有其安全的考量。其设计流程主要为了解决以下几个问题:
* 代币如何创建,由谁来创建?
* 如果代币只能由合约的owner创建,如何让众筹合约能顺利创建代币?
* 用户转入的ETH如何控制?

1.代币如何创建,由谁来创建?

很显然,不是谁都能创建代币的!通用的做法是让代币合约的创建者,即owner来创建代币。

2.如何让众筹合约能顺利创建代币?

因为用户肯定是通过众筹合约C来参与ICO的,用户转入ICO之后,众筹合约C就需要帮助用户创建代币(在代币合约T中为该用户存入代币数量)。
由于有第一条的限制,我们就需要想方设法让众筹合约C成为代币合约T的owner。做法是这样的:
1. 调用代币合约T中的changeOwner方法,修改它的所有者为众筹合约C;
2. 调用众筹合约C的acceptTokenOwner方法,接受成为代币合约T的owner;

这样,众筹合约C就成为了代币合约T的owner,拥有了创建代币的权限。

如果以后我想要进行第二轮众筹,换了个众筹合约的话,还想沿用之前的代币合约该怎么办呢?很简单,跟上述方法一样,众筹合约也可以把自己对代币合约的owner权限转移给下一个众筹合约。原则上,owner的传递可以一直进行下去。

用户转入的ETH如何控制?

一般团队需要对众筹到的ETH进行控制,比如锁定一定时期,限制提取额度,双重签名校验等,都可以通过钱包合约来控制。

总结

基于以太坊ICO的安全性考量,主要就集中在三个合约(众筹合约、Token合约、钱包合约)的安全性审查。ICO涉及到的资金巨大,其中任何一个合约出现漏洞都会带来巨大损失。
AE被盗十几万ETH,就是因为使用了Parity一个有漏洞的官方钱包。这足以让我们警醒,不要太相信所谓的“官方”,进行ICO之前,项目团队一定要对合约代码进行多次审核,确保无漏洞再发布。

引用

Ethereum WhitePaper
BancorCrowdsale
StatusCrowdsale

猜你喜欢

转载自blog.csdn.net/clprosperity/article/details/53245874