實現內容:從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的全部內容,若有不當之處歡迎討論。