實現內容:從remix上的虛擬賬戶上轉賬給自己編寫的智能合約賬戶
前提基礎:對solidity有一些基礎了解,對以太坊的賬戶機制有一定了解。
賬戶
在以太坊中賬戶的唯一標識是地址(address)。
在solidity中即地址類型。但是地址類型也分為兩種:address
和 address payable
。地址類型最常用的成員變量有balance
,即當前賬戶余額。具體成員變量可查看文檔
而address payable
和 address
相同,不過還具有成員transfer()
和 send()
這樣使得其可以接收向該賬戶的轉賬。
receive()函數
一個合約最多有一個 receive
函數, 聲明函數為: receive() external payable { ... }
在對合約沒有任何附加數據調用(通常是對合約轉賬)是會執行 receive
函數。例如:通過 .send()
或者 .transfer()
如果 receive
函數不存在,但是有payable的 fallback 回退函數,那么在進行純以太轉賬時,fallback 函數會調用.
如果兩個函數都沒有,這個合約就沒法通過常規的轉賬交易接收以太(會拋出異常)。
fallback()函數
在一個合約中最多有一個fallback()
函數,函數聲明為: fallback () external [payable]{...}
,這個函數不能有參數和返回值。(高級版本中可以,文檔)
作用:當調用一個合約中不存在的函數或者調用空方法時,亦或使用合約地址的內置函數transfoer()
和send()
的時,若沒有receive()
函數,則會執行目標合約的fallback()函數。
所以在我們對合約賬戶進行轉賬的例子中,必須包含fallback()
函數,否則運行時會報錯失敗。規范寫的話則需要包含receive()
函數和 fallback()
函數
代碼:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.7.0;
contract transferTest {
// 向合約賬戶轉賬
function transderToContract() payable public {
payable(address(this)).transfer(msg.value);
}
// 獲取合約賬戶余額
function getBalanceOfContract() public view returns (uint256) {
return address(this).balance;
}
fallback() external payable {}
receive() external payable {}
}
// 使用的編譯器版本為:0.7.5
代碼比較簡單,但需要注意的幾點:
- 得到賬戶合約地址使用:
address(this)
address
轉address payable
是顯式轉換:payable(address)
address payable
轉address
是隱式轉換。msg.value
是調用者傳入的
操作:
-
點擊compile對合約代碼進行編譯
-
點擊DEPLOY&RUN TRANSACTIONS,並點擊Deploy進行部署
-
底下Deployed Contracts中會出現一個已經部署好的合約,我們可以通過點擊
transderToContract()
進行調用函數。假設我們需要向合約地址轉賬10個以太幣
圖中我們向合約用戶轉賬10個以太幣,右下方的控制台中可以查看到交易的hash碼,也可以debug去查看運行細節。
-
點擊
getBalanceOfContract()
進行查看當前合約用戶中的余額。這里是以wei為單位,所以有一大串的0。
以上就是整個demo的全部內容,若有不當之處歡迎討論。