現在,我們將示範部署一個功德箱的智能合約。此功德箱會紀錄單一次捐款最多金額的地址。
開啟 remix,在 contrasts 資料夾內新增一個檔案 MeritBox.sol
貼上程式碼
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;
contract MeritBox {
address public _owner; // 紀錄是哪個地址部署這份合約
uint256 public _maxValue; // 紀錄捐款最多者
address public _maxDonor; // 紀錄捐款最多的數量
constructor() { // 部署合約時會
_owner = msg.sender; // 將呼叫函數者(在 constructor 內即為部署合約者)的地址存為 _owner
}
function withdraw() public { // withdraw 函數
require(msg.sender == _owner); // 僅有 _owner 可以呼叫此函數
payable(_owner).transfer(address(this).balance); // 將此合約地址的餘額通通轉帳予 _owner
}
receive() external payable { // 若非呼叫函數,僅是將 eth 送至合約地址,會執行 receive
if (msg.value > _maxValue) { // 如果這次的金額大於最大值
_maxValue = msg.value; // 設定 _maxValue 為這次的金額
_maxDonor = msg.sender; // 設定 _maxDonor 為這次的發送者
}
}
}
編譯程式碼
部署合約,ENVIRONMENT 選擇 「Injected Provider」,可以連結到 Metamask 的錢包(記得選擇測試鏈)
Metamask 切換其他帳號,並轉帳至此地址,此時就會觸發合約中的 receive
函數
現在回到 remix ,在 Deployed Contract 中可以點選變數,查看合約現在的狀態
查詢結果可以發現這三個變數已經被改動了( _maxValue
的單位是 wei,所以是 0.1*10^-18)
若按下 「withdraw」,可以執行「withdraw」函數,若此時 Metamask 選擇的帳號不是當初部署合約的地址,會被 require
擋下
以當初發布合約的地址去呼叫 「withdraw」,就會將功德箱內的所有代幣轉至此地址