021:ERC20眾籌實例之合約分析|《ETH原理與智能合約開發(fā)》筆記

待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》慷妙,馬良老師講授膝擂。此簡書文集記錄我的學習筆記架馋。

課程共8節(jié)課狞山。其中萍启,前四課講ETH原理屏鳍,后四課講智能合約孕蝉。
第七課分為三部分:

  1. Solidity語法之多繼承
  2. ERC20眾籌實例之合約分析
  3. ERC20眾籌實例之部署調(diào)試

這篇文章是第七課第二部分的學習筆記:ERC20眾籌實例之合約分析降淮。(1)


這節(jié)課主要講解了一個眾籌合約的代碼分析(Open Zeppelin 框架)霍殴。這里的眾籌系吩,有個高大上的名字叫 ICO

ICO(是Initial Coin Offering縮寫)月弛,首次幣發(fā)行,源自股票市場的首次公開發(fā)行(IPO)概念,是區(qū)塊鏈項目首次發(fā)行代幣厉萝,募集比特幣谴垫、以太坊等通用數(shù)字貨幣的行為胳施。

1肢专、Open Zeppelin Token 分析

這個眾籌合約是基于 Open Zeppelin 安全智能合約開發(fā)框架來實現(xiàn)的博杖。這個框架下有很多不同的合約剃根,這里主要介紹跟 ERC20 有關的。關于 ERC20 在第五課中有過分析狈醉。 ERC20 規(guī)范有六個接口組成,在Open Zeppelin 中分解到了 4 個合約來完成苗傅。如圖班巩。

Open Zeppelin 合約

首先是 ERC20 Basic,這是一個抽象合約逊桦,就是它只定義了接口抑进,沒實現(xiàn)功能。它是一個最基礎的合約寺渗,在這個合約中兰迫,它定義了三個接口,totalSupply, banlanceOf, transfer逮矛。

然后是延伸出 ERC20 合約转砖。它擴展定義了三個新的接口,allowance, transferFrom, approve府蔗,依然是沒有實現(xiàn),這是個抽象合約姓赤。

再一個是 Basic Token 合約,它繼承自 ERC20 Basic不铆,實現(xiàn)了 ERC20 Basic 的三個接口。這里面有一個映射誓斥,mapping(address=> uint256),是地址到余額的映射毕谴。

Standard Token 繼承自 ERC20 距芬,基本實現(xiàn)了擴展合約中的三個接口。因為它也繼承自 Basic Token 舀武,所以它還有 Basic Token 所實現(xiàn)的三個功能奕剃。這是一個典型的鉆石型多繼承關系捐腿。這里面的映射相對來說復雜一些,mapping (address => mapping(address => uint256))聂薪,允許其它的賬戶從一個賬戶取走多少額度家乘。

后面是一個 Mintable Token仁锯,類似于一個造幣廠的功能业崖,根據(jù)有多少人來買双炕,來增加供給量。它還繼承自 Ownable 合約撮抓,它不但允許在初始時設置合約所有者的所有權,也允許更換所有者丹拯。

框架中還用到了 SafeMath Lib,主要是處理一些數(shù)學問題乖酬,比如防止溢出。

2剑刑、Open Zeppelin 代碼

在執(zhí)行了本課第三部分的安裝等工作后双肤,可以查看到有關 Open Zeppelin 的代碼。接下來分析一下具體的代碼茅糜。

2.1 ERC20Basic.sol

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

進入到 /node_modules/openzeppelin-solidity/contracts 目錄,執(zhí)行 vim token/ERC20/ERC20Basic.sol 打開這個文件蔑赘。

ERC20Basic.sol

它是一個抽象合約,并沒有實現(xiàn)具體的接口耙箍,只是定義了這三個接口。如圖酥馍。第一個是查詢總的供給量。第二個是查詢特定帳戶的余額旨袒。第三個是轉賬术辐。最后還定義了一個事件施无,記錄轉賬這個事件。

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行,分別實現(xiàn)了以下三個接口绝页。

function transferFrom
function approve
function allowance

接下來是兩個自定義的接口寂恬,不再是 ERC20 中強制規(guī)定的接口。

一個是增加余額的額度(第73行)初肉,它的實現(xiàn)方式不是直接賦予一個新值,這種方式有漏洞,不安全属铁,在前面的注釋中有說明。它是使用原有的值躬翁,使用SafeMath增加一個數(shù)值,再來更新盒发。避免兩次操作(這里不懂)。同時記錄下事件拼卵。

另一個是相反的操作,減少額度(第89行)蛮艰。這里有一個例外,就是降低的數(shù)值超過了原有的額度壤蚜,就置為 0 。不例外的情況下袜刷,它也是使用 SafeMath 函數(shù),做一個減法墩蔓,同時記錄下事件。

2.4 Ownable.sol

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

Ownable.sol

這個主要是管理合約的發(fā)起人萧豆。這種模式很常用奸披,在構造函數(shù)中記錄合約的發(fā)起人,之后一般是增加一個修飾器炕横,專門檢查調(diào)用這個合約的人是不是合約的發(fā)起人源内。這個合約有個特殊的地方就是份殿,它允許你轉發(fā)合約所有者的身份嗽交。只有合約的所有者才能轉讓,它會轉讓一個新的地址夫壁,先檢查地址是否為空,如果不空,記錄這個事件司蔬,把所有者設置為新的所有者。

2.5 MintableToken.sol

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

MintableToken.sol

這個是造幣的合約俊啼。它繼承自 Ownable.sol 和 StandardToken.sol 合約(第13行)左医,還有兩個事件,一個是造幣浮梢,一個是造幣結束跛十。后面是一個布爾值,如果為真秕硝,表示造幣活動停止(發(fā)行結束)芥映。

第 31 行是向一個地址發(fā)行代幣,這條只有合約的所有者才可以執(zhí)行缝裤。同時還要檢查發(fā)行活動是否繼續(xù)屏轰。如果都沒有問題,先增加總供給量憋飞,同時也要對目標地址的余額進行更新霎苗,記錄下兩個事件。

下面 43 的接口也是只能合約的所有者才可以調(diào)用榛做。檢查是不是正在發(fā)行唁盏,如果發(fā)行活動結束了,就把“結束”設為真检眯,記錄下這個事件厘擂。

小結,這節(jié)課主要講解了Open Zeppelin 安全智能合約開發(fā)框架锰瘸,并分析了其中的幾個代碼文件刽严。代碼涉及的知識點比較多,平時要注意多積累避凝。


不足之處舞萄,請批評指正,謝謝倒脓。

課程地址為:深入淺出ETH原理與智能合約開發(fā)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甘晤,一起剝皮案震驚了整個濱河市线婚,隨后出現(xiàn)的幾起案子酌伊,更是在濱河造成了極大的恐慌缀踪,老刑警劉巖驴娃,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唇敞,死亡現(xiàn)場離奇詭異疆柔,居然都是意外死亡,警方通過查閱死者的電腦和手機模叙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門范咨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渠啊,“玉大人替蛉,你說我怎么就攤上這事躲查±ば埃” “怎么了罚缕?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵黔衡,是天一觀的道長。 經(jīng)常有香客問我夜牡,道長塘装,這世上最難降的妖魔是什么蹦肴? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任阴幌,我火速辦了婚禮矛双,結果婚禮上蟆豫,老公的妹妹穿的比我還像新娘。我一直安慰自己徙瓶,他們只是感情好侦镇,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荔棉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渣触。 梳的紋絲不亂的頭發(fā)上嗅钻,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天养篓,我揣著相機與錄音柳弄,去河邊找鬼。 笑死嚣伐,一個胖子當著我的面吹牛纤控,可吹牛的內(nèi)容都是我干的碉纺。 我是一名探鬼主播骨田,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼舱呻,長吁一口氣:“原來是場噩夢啊……” “哼悠汽!你這毒婦竟也來了柿冲?” 一聲冷哼從身側響起假抄,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宿饱,失蹤者是張志新(化名)和其女友劉穎谬以,沒想到半個月后为黎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡柠座,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妈经。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡爆哑,死狀恐怖舆吮,靈堂內(nèi)的尸體忽然破棺而出色冀,到底是詐尸還是另有隱情,我是刑警寧澤屯换,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站索守,受9級特大地震影響晕窑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卵佛,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一幕屹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧级遭,春花似錦望拖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丢郊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間架诞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工很泊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親继蜡。 傳聞我的和親對象是個殘疾皇子稀并,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容