待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》慷妙,馬良老師講授膝擂。此簡書文集記錄我的學習筆記架馋。
課程共8節(jié)課狞山。其中萍启,前四課講ETH原理屏鳍,后四課講智能合約孕蝉。
第七課分為三部分:
- Solidity語法之多繼承
- ERC20眾籌實例之合約分析
- 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 個合約來完成苗傅。如圖班巩。
首先是 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 打開這個文件蔑赘。
它是一個抽象合約,并沒有實現(xiàn)具體的接口耙箍,只是定義了這三個接口。如圖酥馍。第一個是查詢總的供給量。第二個是查詢特定帳戶的余額旨袒。第三個是轉賬术辐。最后還定義了一個事件施无,記錄轉賬這個事件。
2.2 ERC20.sol
/node_modules/openzeppelin-solidity/contracts/token/ERC20/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 繼承自 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
這個主要是管理合約的發(fā)起人萧豆。這種模式很常用奸披,在構造函數(shù)中記錄合約的發(fā)起人,之后一般是增加一個修飾器炕横,專門檢查調(diào)用這個合約的人是不是合約的發(fā)起人源内。這個合約有個特殊的地方就是份殿,它允許你轉發(fā)合約所有者的身份嗽交。只有合約的所有者才能轉讓,它會轉讓一個新的地址夫壁,先檢查地址是否為空,如果不空,記錄這個事件司蔬,把所有者設置為新的所有者。
2.5 MintableToken.sol
/node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol
這個是造幣的合約俊啼。它繼承自 Ownable.sol 和 StandardToken.sol 合約(第13行)左医,還有兩個事件,一個是造幣浮梢,一個是造幣結束跛十。后面是一個布爾值,如果為真秕硝,表示造幣活動停止(發(fā)行結束)芥映。
第 31 行是向一個地址發(fā)行代幣,這條只有合約的所有者才可以執(zhí)行缝裤。同時還要檢查發(fā)行活動是否繼續(xù)屏轰。如果都沒有問題,先增加總供給量憋飞,同時也要對目標地址的余額進行更新霎苗,記錄下兩個事件。
下面 43 的接口也是只能合約的所有者才可以調(diào)用榛做。檢查是不是正在發(fā)行唁盏,如果發(fā)行活動結束了,就把“結束”設為真检眯,記錄下這個事件厘擂。
小結,這節(jié)課主要講解了Open Zeppelin 安全智能合約開發(fā)框架锰瘸,并分析了其中的幾個代碼文件刽严。代碼涉及的知識點比較多,平時要注意多積累避凝。
不足之處舞萄,請批評指正,謝謝倒脓。
課程地址為:深入淺出ETH原理與智能合約開發(fā)