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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM