menu-icon
anue logo
鉅樂部鉅亨號鉅亨買幣
search icon
區塊鏈

Solidity極簡入門|第二十講:發送ETH transfer,send和call

BlockBeats 律動財經 2022-08-19 20:30

cover image of news article
律動財經圖片

我最近在重新學 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 社群(點此入群
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!

前往鉅亨買幣找交易所優惠






Empty