021:ERC20众筹实例之合约分析|《ETH原理与智能合约开发》笔记

待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此简书文集记录我的学习笔记。

课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第七课分为三部分:

  1. Solidity语法之多继承
  2. ERC20众筹实例之合约分析
  3. ERC20众筹实例之部署调试

这篇文章是第七课第二部分的学习笔记:ERC20众筹实例之合约分析。(1)


这节课主要讲解了一个众筹合约的代码分析(Open Zeppelin 框架)。这里的众筹,有个高大上的名字叫 ICO

ICO(是Initial Coin Offering缩写),首次币发行,源自股票市场的首次公开发行(IPO)概念,是区块链项目首次发行代币,募集比特币、以太坊等通用数字货币的行为。

1、Open Zeppelin Token 分析

这个众筹合约是基于 Open Zeppelin 安全智能合约开发框架来实现的。这个框架下有很多不同的合约,这里主要介绍跟 ERC20 有关的。关于 ERC20 在第五课中有过分析。 ERC20 规范有六个接口组成,在Open Zeppelin 中分解到了 4 个合约来完成。如图。

Open Zeppelin 合约

首先是 ERC20 Basic,这是一个抽象合约,就是它只定义了接口,没实现功能。它是一个最基础的合约,在这个合约中,它定义了三个接口,totalSupply, banlanceOf, transfer。

然后是延伸出 ERC20 合约。它扩展定义了三个新的接口,allowance, transferFrom, approve,依然是没有实现,这是个抽象合约。

再一个是 Basic Token 合约,它继承自 ERC20 Basic,实现了 ERC20 Basic 的三个接口。这里面有一个映射,mapping(address=> uint256),是地址到余额的映射。

Standard Token 继承自 ERC20 ,基本实现了扩展合约中的三个接口。因为它也继承自 Basic Token ,所以它还有 Basic Token 所实现的三个功能。这是一个典型的钻石型多继承关系。这里面的映射相对来说复杂一些,mapping (address => mapping(address => uint256)),允许其它的账户从一个账户取走多少额度。

后面是一个 Mintable Token,类似于一个造币厂的功能,根据有多少人来买,来增加供给量。它还继承自 Ownable 合约,它不但允许在初始时设置合约所有者的所有权,也允许更换所有者。

框架中还用到了 SafeMath Lib,主要是处理一些数学问题,比如防止溢出。

2、Open Zeppelin 代码

在执行了本课第三部分的安装等工作后,可以查看到有关 Open Zeppelin 的代码。接下来分析一下具体的代码。

2.1 ERC20Basic.sol

/node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

进入到 /node_modules/openzeppelin-solidity/contracts 目录,执行 vim token/ERC20/ERC20Basic.sol 打开这个文件。

ERC20Basic.sol

它是一个抽象合约,并没有实现具体的接口,只是定义了这三个接口。如图。第一个是查询总的供给量。第二个是查询特定帐户的余额。第三个是转账。最后还定义了一个事件,记录转账这个事件。

2.2 ERC20.sol

/node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

ERC20.sol

这个 ERC20.sol 仍然是一个抽象合约,它继承自 ERC20Basic.sol ,所以在第 3 行引入了 ERC20Basic.sol 的源代码。
它定义了三个接口和一个事件。第一个是 allowance ,意思是 spender 可以从 owner 那里取多少余额。第二个是一个地址到另一个地址的转账操作。第三个是甲方向一个特定的乙方授予一定的额度。最后是记录这个事件,已被应用程度来查询。

2.3 StandardToken.sol

/node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol

StandardToken.sol

这个 StandardToken.sol 继承自 ERC20.sol 和 BasicToken.sol,所以在第 3、4 行引入了 这两个合约。

第25、47、59行,分别实现了以下三个接口。

function transferFrom
function approve
function allowance

接下来是两个自定义的接口,不再是 ERC20 中强制规定的接口。

一个是增加余额的额度(第73行),它的实现方式不是直接赋予一个新值,这种方式有漏洞,不安全,在前面的注释中有说明。它是使用原有的值,使用SafeMath增加一个数值,再来更新。避免两次操作(这里不懂)。同时记录下事件。

另一个是相反的操作,减少额度(第89行)。这里有一个例外,就是降低的数值超过了原有的额度,就置为 0 。不例外的情况下,它也是使用 SafeMath 函数,做一个减法,同时记录下事件。

2.4 Ownable.sol

/node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol

Ownable.sol

这个主要是管理合约的发起人。这种模式很常用,在构造函数中记录合约的发起人,之后一般是增加一个修饰器,专门检查调用这个合约的人是不是合约的发起人。这个合约有个特殊的地方就是,它允许你转发合约所有者的身份。只有合约的所有者才能转让,它会转让一个新的地址,先检查地址是否为空,如果不空,记录这个事件,把所有者设置为新的所有者。

2.5 MintableToken.sol

/node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol

MintableToken.sol

这个是造币的合约。它继承自 Ownable.sol 和 StandardToken.sol 合约(第13行),还有两个事件,一个是造币,一个是造币结束。后面是一个布尔值,如果为真,表示造币活动停止(发行结束)。

第 31 行是向一个地址发行代币,这条只有合约的所有者才可以执行。同时还要检查发行活动是否继续。如果都没有问题,先增加总供给量,同时也要对目标地址的余额进行更新,记录下两个事件。

下面 43 的接口也是只能合约的所有者才可以调用。检查是不是正在发行,如果发行活动结束了,就把“结束”设为真,记录下这个事件。

小结,这节课主要讲解了Open Zeppelin 安全智能合约开发框架,并分析了其中的几个代码文件。代码涉及的知识点比较多,平时要注意多积累。


不足之处,请批评指正,谢谢。

课程地址为:深入浅出ETH原理与智能合约开发

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容