Solidity極簡入門|第二十講:發送ETH transfer,send和call
BlockBeats 律動財經 2022-08-19 20:30
我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每周更新 1-3 講。
所有代碼和教程開源在 github: github.com/AmazingAng/WTFSolidity
Solidity 有三種方法向其他合約發送 ETH,他們是:transfer(),send() 和 call(),其中 call() 是被鼓勵的用法。
接收 ETH 合約
我們先部署一個接收 ETH 合約 ReceiveETH。ReceiveETH 合約里有一個事件 Log,記錄收到的 ETH 數量和 gas 剩餘。還有兩個函數,一個是 receive(),收到 ETH 被觸發,並發送 Log 事件;另一個是查詢合約 ETH 餘額的 getBalance().
部署好合約後,運行 getBalance() 函數,可以看到當前合約的 ETH 餘額為 0.
發送 ETH 合約
我們將實現三種方法向 ReceiveETH 合約發送 ETH。首先,先在發送 ETH 合約 SendETH 中實現 payable 的構造函數和 receive(),讓我們能夠在部署時和部署後向合約轉賬。
transfer
- 用法是 transfer(發送 ETH 數額)。
- transfer() 的 gas 限制是 2300,足夠用於轉賬,但對方合約的 fallback() 或 receive() 函數不能實現太複雜的邏輯。
- transfer() 如果轉賬失敗,會自動 revert(回滾交易)。
代碼樣例,注意參數中的_to 填 ReceiveETH 合約的地址,amount 是 ETH 轉賬金額:
send
- 用法是 send(發送 ETH 數額)。
- send() 的 gas 限制是 2300,足夠用於轉賬,但對方合約的 fallback() 或 receive() 函數不能實現太複雜的邏輯。
- send() 如果轉賬失敗,不會 revert。
- send() 的返回值是 bool,代表着轉賬成功或失敗,需要額外代碼處理一下。
代碼樣例:
call
- 用法是 call{value: 發送 ETH 數額}("")。
- call() 沒有 gas 限制,可以支持對方合約 fallback() 或 receive() 函數實現複雜邏輯。
- call() 如果轉賬失敗,不會 revert。
- call() 的返回值是 (bool, data),其中 bool 代表着轉賬成功或失敗,需要額外代碼處理一下。
代碼樣例:
運行三種方法,可以看到,他們都可以成功的向 ReceiveETH 合約發送 ETH。
總結
這一講,我們介紹 solidity 三種發送 ETH 的方法:transfer,send 和 call。
call 沒有 gas 限制,最為靈活,是最提倡的方法;transfer 有 2300 gas 限制,但是發送失敗會自動 revert 交易,是次優選擇;send 有 2300 gas 限制,而且發送失敗不會自動 revert 交易,幾乎沒有人用它。
暢行幣圈交易全攻略,專家駐群實戰交流
▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群)
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!
- 加入鉅亨買幣LINE官方帳號索取免費課程
- 掌握全球財經資訊點我下載APP
文章標籤
上一篇
下一篇