015:合約結(jié)構(gòu)|《ETH原理與智能合約開發(fā)》筆記

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

課程共8節(jié)課。其中狞尔,前四課講ETH原理丛版,后四課講智能合約。
第五課分為三部分:

  1. Dapp用例
  2. 合約結(jié)構(gòu)
  3. Solidity語法

這篇文章是第五課第二部分的學(xué)習(xí)筆記:合約結(jié)構(gòu) 偏序。


這節(jié)課主要講解了智能合約結(jié)構(gòu)页畦、ERC20、ERC721規(guī)范研儒。

1豫缨、智能合約結(jié)構(gòu)

1.1 智能合約的結(jié)構(gòu)

智能合約的源代碼由以下7個(gè)部分組成。

  1. 版本聲明
    在以太坊的solidity編程語言中端朵,各個(gè)大版本之間不具有兼容性好芭,所以需要在開頭聲明版本號。不能在之前或之后的版本中運(yùn)行冲呢,如pragma solidity ^0.4.x舍败,不能在0.3或0.5的系統(tǒng)中運(yùn)行。

  2. 包含其它代碼文件:import
    可以引入其它文件或者庫。

  3. 合約的定義
    使用關(guān)鍵字contract邻薯,后面跟上合約的名字裙戏。contract 合約名

  4. 存儲(chǔ)狀態(tài)變量
    這部分內(nèi)容需要存儲(chǔ)在Storage Root中。(第3課)

  5. 構(gòu)造函數(shù)
    它是一類很特殊的函數(shù)弛说,它在合約被創(chuàng)建的交易中被執(zhí)行一次挽懦,函數(shù)名需要與合約名相同。(與C++的構(gòu)造函數(shù)類似)

  6. 調(diào)用接口函數(shù)
    提供給其它賬戶調(diào)用木人。

  7. 事件
    用于記錄關(guān)鍵這個(gè)步驟與信息信柿。

1.2 智能合約的ABI

開發(fā) DApp 時(shí)要調(diào)用在區(qū)塊鏈上的 Ethereum 智能合約,就需要智能合約的 ABI醒第。ABI(Application Binary Interface)主要是規(guī)范外部賬戶與合約之間二進(jìn)制數(shù)據(jù)的編碼規(guī)范渔嚷。

要調(diào)用一個(gè)合約特定的接口,首先要有合約的地址稠曼。在這個(gè)合約眾多的接口中形病,怎么找到需要調(diào)用的那一個(gè),這就要用到函數(shù)簽名霞幅。函數(shù)的簽名由函數(shù)名與所有參數(shù)類型組成(返回值類型不算在內(nèi))漠吻,編碼的前四個(gè)字節(jié)是函數(shù)簽名的Keccak256 單向散列值的前四字節(jié)。如:function baz(uint32 x, bool y)這個(gè)函數(shù)司恳,其編碼的前四個(gè)字節(jié)是baz(uint32,bool)經(jīng)過Keccak256計(jì)算后途乃,再取前四個(gè)字節(jié)0xcdcd77c0。從第五字節(jié)開始對輸入的實(shí)際調(diào)用參數(shù)進(jìn)行編碼扔傅,并補(bǔ)齊32字節(jié)耍共。比如例子中的x, y分別取值0x88,0x1猎塞,補(bǔ)齊32字節(jié)试读。

1.3 通過 remix 介紹合約結(jié)構(gòu)

1.3.1 一個(gè)小例子

打開remix網(wǎng)站,自帶一個(gè)例子程序荠耽」澈В→Remix

remix中的合約例子

此外,老師的例子開頭處铝量,比我的多了兩行伊履,導(dǎo)入其它文件。分別是導(dǎo)入github上的文件款违,和導(dǎo)入本地的文件唐瀑。

import "github.com/ethereum/dapp-bin/library/iterable-mapping.sol";
import "./test.sol";

1.3.2 solidity中的注釋

有三種。
/*注釋*/插爹,類似于C語言中的注釋哄辣;
//注釋请梢,類似于C++中的注釋;
///注釋力穗,也可以三個(gè)斜杠毅弧,主要用于函數(shù)前,說明函數(shù)作用当窗。

1.3.3 remix的使用

remix是一個(gè)強(qiáng)大的IDE(Integrated Development Environment 够坐,集成開發(fā)環(huán)境)。

中間是代碼區(qū)崖面,右邊有六個(gè)表單元咙。

  1. Compile
    編譯,可以設(shè)置為自動(dòng)編譯巫员,修改后自動(dòng)執(zhí)行庶香。

Detail按鈕可以查看該程序的詳細(xì)信息。點(diǎn)開彈出简识。其中赶掖,METADATA是該程序的元數(shù)據(jù),含有編譯器的版本七扰,和其它的一些數(shù)據(jù)等奢赂。這里關(guān)注一下ABI數(shù)據(jù)。它是關(guān)于接口的颈走,點(diǎn)開具體的接口膳灶,可以看到接口的名字,輸入和輸出等疫鹊。

  1. Run
    運(yùn)行代碼袖瞻。

它提供了三種運(yùn)行環(huán)境司致,自己練習(xí)可以選用JavaScript VM拆吆,在本地運(yùn)行,速度快脂矫。它自動(dòng)提供了5個(gè)賬號枣耀,每個(gè)都含有100ETH。Gas limit是發(fā)起合約的Gas上限庭再;Value是發(fā)送以太幣到一個(gè)合約時(shí)發(fā)送的數(shù)量捞奕。

Deploy布署一個(gè)合約。代碼區(qū)的下面拄轻,有控制臺(tái)可以看到合約執(zhí)行情況颅围。

  1. Settings
    設(shè)置。主要是設(shè)置編譯器的版本恨搓。

  2. Analysis
    分析院促。主要是一些安全性的分析筏养,比如Gas的數(shù)量,使用情況常拓;還有一些雜項(xiàng)渐溶。

  3. Debugger
    調(diào)試。后面在具體的例子中再介紹弄抬。

  4. Support

2茎辐、ERC 20 規(guī)范

前面介紹的DApp例子中,大部分使用了ERC 20 規(guī)范掂恕。
官方文檔:ERC20規(guī)范

這個(gè)規(guī)范有六個(gè)接口是強(qiáng)制必須實(shí)施的拖陆。

  1. totalSupply()總的供給量
  2. balanceOf(address tokenOwner)查詢某一地址的余額
  3. approve(address spender, uint tokens) 代幣擁有者授權(quán)某地址,可以在未來多次從擁有者的賬戶使用代幣竹海。它有一點(diǎn)安全問題慕蔚,即授權(quán)數(shù)量要改變時(shí),需要先改為零斋配,再改為更改的值孔飒。
  4. allowance(address tokenOwner,address spender)查詢操作,查詢一個(gè)代幣的擁有者艰争,還可以允許支出者花費(fèi)多少代幣坏瞄。這個(gè)跟前面的approve有關(guān)。
  5. transferFrom(address from, address to,uint tokens) 授權(quán)的地址從擁有者那里花費(fèi)代幣甩卓,也和approve結(jié)合使用鸠匀。花費(fèi)的數(shù)量要小于授權(quán)的數(shù)量逾柿,如果大于則失斪汗鳌;地址輸入錯(cuò)誤机错,也會(huì)失敗爬范。
  6. transfer(address to, uint tokens) 轉(zhuǎn)移代幣,把自己的代幣移給目標(biāo)地址弱匪。

還有三個(gè)可選操作青瀑。name() , symbol(), decimals(),分別是名稱萧诫,符號斥难,可以分割的程度,如18帘饶,1ETH可以分割為10^18份哑诊。

還有兩個(gè)事件。event Transfer(address from, address to, uint256 value)及刻,event Approval(address owner, address spender, uint256 value)镀裤,分別是記錄Transfer和Approval的操作穷当。

ERC20本質(zhì)說明

說明一下ERC20規(guī)范的本質(zhì)。它其實(shí)是維護(hù)了兩張表淹禾。

一張是每個(gè)地址對應(yīng)了多少代幣馁菜,如左圖。所有余額加起來就是總的供給量铃岔。轉(zhuǎn)移代幣是把一個(gè)地址的余額減少一定的數(shù)值汪疮,另一個(gè)地址增加相應(yīng)的數(shù)值。查詢余額就是從這張表中查詢毁习。

另一張表是如右圖的樣子智嚷,包含了許可的賬戶及許可額。再說明一下許可(Approval)的意義纺且。假如合約A調(diào)用合約B盏道,如果在調(diào)用前直接把代幣打到B,B收到幣后會(huì)有不執(zhí)行合約的風(fēng)險(xiǎn)载碌,因此不能先直接給B轉(zhuǎn)移代幣猜嘱。ERC20的做法是分為兩步,先授權(quán)B一定額度的代幣嫁艇,B執(zhí)行時(shí)朗伶,從A那里支取代幣。因?yàn)轭~度預(yù)先分配了步咪,所以轉(zhuǎn)移會(huì)成功论皆。

3、ERC 721 規(guī)范

官方文檔:ERC721規(guī)范

ERC 20 和ERC 721 的不同猾漫,可以做一個(gè)類比点晴。ERC 20 可以類比為現(xiàn)實(shí)中的錢幣,你的5塊錢和我的5塊錢是等價(jià)的悯周,沒有什么不同粒督。我們的錢還都可以再細(xì)分。而ERC 721队橙,主要是用在游戲中的道具坠陈,比如以太坊中的加密貓游戲萨惑,你的貓和我的貓是不一樣的捐康。我們的貓也不能分割為半只貓。每只貓都有不同的特性庸蔼,是非同質(zhì)的解总。

在數(shù)據(jù)結(jié)構(gòu)上,其本質(zhì)與ERC 20 沒有太大的區(qū)別姐仅,也是維護(hù)兩張表花枫。具體內(nèi)容如下刻盐。

  1. balanceOf(address tokenOwner) 一個(gè)地址下的余額;
  2. ownerOf(uint256 tokenId) 從一個(gè)ID查詢其主人是誰劳翰;
  3. safeTransferFrom(address from, address to, uint256 tokenId, bytes data) 轉(zhuǎn)換操作敦锌,把代幣轉(zhuǎn)移到合約;
  4. safeTransferFrom(address from, address to, uint256 tokenId) 轉(zhuǎn)換操作佳簸,把代幣轉(zhuǎn)移到地址乙墙;
  5. transferFrom(address from, address to, uint256 tokenId) 傳統(tǒng)的轉(zhuǎn)移方式;

3生均、4和5兩種方式的區(qū)別听想,5不檢查接收者是否為一個(gè)合約地址,而3和4會(huì)檢查接收者是否為合約地址马胧,還會(huì)校驗(yàn)地址汉买。

  1. approve(address approved, uint256 tokenId) 授權(quán)某一地址一定的代幣;

  2. METADATA (Name, SYM, URI) 元數(shù)據(jù):名稱佩脊,符號蛙粘,超鏈接。鏈接可以指向一張圖片威彰,如加密貓的外觀圖组题。

  3. setApprovalForAll(address operator, bool approved) external; 允許一個(gè)地址完全控制自己的代幣;

  4. getApproved(uint256 tokenId) 查詢哪個(gè)賬戶有一個(gè)ID的許可權(quán)抱冷;

  5. isApprovedForAll(address owner, address operator) 查詢一個(gè)地址是否擁有一個(gè)地址所有的操作權(quán)崔列。

還有三個(gè)事件,對應(yīng)操作發(fā)生時(shí)負(fù)責(zé)記錄下日志旺遮。

  1. event Transfer(address indexed from, address indexed to, uint256 tokenId)
  2. event Approval(address owner, address _approved, uint256 _tokenId)
  3. evnet ApprovalForAll(address owner, address operator, bool approved)

總結(jié)一下赵讯,這節(jié)課主要介紹了智能合約結(jié)構(gòu)、ERC20耿眉、ERC721規(guī)范边翼,還簡要介紹了Remix的使用。


不足之處鸣剪,請批評指正组底,感謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筐骇,一起剝皮案震驚了整個(gè)濱河市债鸡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铛纬,老刑警劉巖厌均,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異告唆,居然都是意外死亡棺弊,警方通過查閱死者的電腦和手機(jī)晶密,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來模她,“玉大人稻艰,你說我怎么就攤上這事〕蘧唬” “怎么了连锯?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長用狱。 經(jīng)常有香客問我运怖,道長,這世上最難降的妖魔是什么夏伊? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任摇展,我火速辦了婚禮,結(jié)果婚禮上溺忧,老公的妹妹穿的比我還像新娘咏连。我一直安慰自己,他們只是感情好鲁森,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布祟滴。 她就那樣靜靜地躺著,像睡著了一般歌溉。 火紅的嫁衣襯著肌膚如雪垄懂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天痛垛,我揣著相機(jī)與錄音草慧,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胀蛮。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼舔示,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了电抚?” 一聲冷哼從身側(cè)響起惕稻,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喻频,沒想到半個(gè)月后缩宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肘迎,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甥温,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年锻煌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻蚓。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宋梧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狰挡,到底是詐尸還是另有隱情捂龄,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布加叁,位于F島的核電站倦沧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏它匕。R本人自食惡果不足惜展融,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豫柬。 院中可真熱鬧告希,春花似錦、人聲如沸烧给。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础嫡。三九已至指么,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榴鼎,已是汗流浹背涧尿。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留檬贰,地道東北人姑廉。 一個(gè)月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像翁涤,于是被迫代替她去往敵國和親桥言。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

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