待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》嫡纠,馬良老師講授递沪。此簡書文集記錄我的學(xué)習(xí)筆記。
課程共8節(jié)課沫勿。其中挨约,前四課講ETH原理,后四課講智能合約产雹。
第六課分為三部分:
- Solidity語法之?dāng)?shù)組
- Solidity語法之合約
- Truffle簡介與使用
這篇文章是第六課第二部分的學(xué)習(xí)筆記:Solidity語法之合約诫惭。
第5課第3小節(jié)簡要介紹了 Solidity 的基礎(chǔ)語法。還有兩部分重要的內(nèi)容要重點講解一下蔓挖,分別是數(shù)組和合約夕土。
這節(jié)課主要講解Solidity合約相關(guān)知識,并有若干實例輔助理解时甚。
1隘弊、合約相關(guān)知識點
1.1 合約調(diào)用
- 合約間接口相互調(diào)用
□ address.function(para)
□ address.call(func_signature, para) - 合約之間轉(zhuǎn)賬
□ address.transfer()
□ address.send()
□ address.call()
□ - address.call.gas(num).value(num)() 缺省的是使用所有可用的Gas - 調(diào)用深度是1024。一般正常情況不會這么多荒适,除非發(fā)生遞歸梨熙。
- delegatecode(),主要是調(diào)用庫函數(shù)刀诬,但還是在當(dāng)前函數(shù)的上下文環(huán)境咽扇。(第四課出現(xiàn)過)
1.1 轉(zhuǎn)賬需要注意的問題
- 可以收錢的接口需要payable。
- 轉(zhuǎn)賬會觸發(fā)接收賬戶的fallback函數(shù)(payable)陕壹。fallback函數(shù)质欲,一個匿名函數(shù)。
- transfer 僅僅轉(zhuǎn)發(fā)2300 gas糠馆, 失敗會拋出異常嘶伟。fallback 要非常簡單。
- send 僅僅轉(zhuǎn)發(fā)2300 gas又碌, 失敗只會返回false九昧。fallback 要非常簡單。
- call.value(amount)() 會轉(zhuǎn)發(fā)全部的可用的gas毕匀,失敗只會返回false铸鹰,容易引起重入型攻擊。
2皂岔、合約相關(guān)實例
1蹋笼、合約間接口調(diào)用實例
代碼見git倉庫,或見下圖躁垛。
- 打開文件 example_2.sol 剖毯,編譯。
-
在 run 頁面教馆,選擇 B_caller 速兔,點擊 Deploy 。下面出現(xiàn)三個接口活玲。
B合約的三個接口 - 在調(diào)用合約前涣狗,先顯示一下A的狀態(tài)值,點 Getstate_A舒憾,顯示為0镀钓。
- 顯式調(diào)用,點擊Invocate_A镀迂,再點擊 Getstate_A丁溅,結(jié)果為15,正確探遵。
- call調(diào)用窟赏。點擊 Call_A 妓柜,返回值為真。再點擊 Getstate_A涯穷,結(jié)果為23棍掐,正確。
特別注意:代碼第45行拷况。keccak256在計算簽名時作煌,函數(shù)的參數(shù)要寫全稱uint256,不要寫簡稱uint赚瘦,否則會出現(xiàn)問題粟誓。因為簽名算法是根據(jù)字符串算的,它不會自動把簡稱替換成全稱起意。
1鹰服、合約間接口調(diào)用實例
- 關(guān)閉example_2.sol,打開example_3.sol揽咕,(有時需要刷新一下瀏覽器)
- 編譯获诈,或勾上自動編譯。
-
在 run 頁面心褐,選擇 B_caller 舔涎,點擊 Deploy 。下面出現(xiàn)四個接口逗爹。
B合約的三個接口 - 在調(diào)用合約前亡嫌,先顯示一下A的狀態(tài)值,點 Getbalance_A掘而,顯示為0挟冠。
- Value值輸入6666,點擊 Transfer_A袍睡,再點擊 Getbalance_A知染,結(jié)果為6666,正確斑胜。
- Value值輸入8888控淡,點擊 Sender_A ,返回值為真止潘。再點擊 Getbalance_A掺炭,結(jié)果為15554,正確凭戴。
- Value值輸入1涧狮,點擊Call_A,返回值為真。再點擊 Getbalance_A者冤,結(jié)果為15555肤视,正確。
以上是將9~11行注釋掉的情況∩娣悖現(xiàn)在去掉這三行的注釋邢滑,再操作一遍。
Transfer_A拜银、Sender_A 操作均失敗殊鞭, Call_A 成功遭垛。而把49行代碼換成第48行代碼時尼桶,又會轉(zhuǎn)賬失敗。
其中锯仪,9~11的三行代碼會消耗6萬個Gas 泵督。transfer、send 僅僅轉(zhuǎn)發(fā)2300個Gas庶喜,所以會失敗小腊。而Call調(diào)用方法,缺省是支付所有Gas久窟,在本例中若限制5萬個Gas秩冈,則轉(zhuǎn)賬失敗。
小結(jié)一下斥扛,本小節(jié)主要講解了 Solidity 合約相關(guān)知識入问,并有兩個實例輔助理解。
不足之處稀颁,請批評指正芬失。