使用remix實現給合約賬戶轉賬

Fortunater發表於2021-01-27

實現內容:從remix上的虛擬賬戶上轉賬給自己編寫的智慧合約賬戶

前提基礎:對solidity有一些基礎瞭解,對以太坊的賬戶機制有一定了解。


賬戶

在以太坊中賬戶的唯一標識是地址(address)。

在solidity中即地址型別。但是地址型別也分為兩種:addressaddress payable 。地址型別最常用的成員變數有balance,即當前賬戶餘額。具體成員變數可檢視文件

address payableaddress 相同,不過還具有成員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)
  • addressaddress payable 是顯式轉換:payable(address)
  • address payableaddress 是隱式轉換。
  • msg.value 是呼叫者傳入的

操作:

  1. 點選compile對合約程式碼進行編譯

    編譯操作

  2. 點選DEPLOY&RUN TRANSACTIONS,並點選Deploy進行部署

    部署合約

  3. 底下Deployed Contracts中會出現一個已經部署好的合約,我們可以通過點選transderToContract()進行呼叫函式。

    假設我們需要向合約地址轉賬10個以太幣

    轉賬

    圖中我們向合約使用者轉賬10個以太幣,右下方的控制檯中可以檢視到交易的hash碼,也可以debug去檢視執行細節。

  4. 點選getBalanceOfContract()進行檢視當前合約使用者中的餘額。

    檢視餘額

    這裡是以wei為單位,所以有一大串的0。


以上就是整個demo的全部內容,若有不當之處歡迎討論。

相關文章