iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Web 3

Web3.0 來襲系列 第 13

智能合約2

  • 分享至 

  • xImage
  •  

現在,我們將示範部署一個功德箱的智能合約。此功德箱會紀錄單一次捐款最多金額的地址。

  1. 開啟 remix,在 contrasts 資料夾內新增一個檔案 MeritBox.sol
    https://ithelp.ithome.com.tw/upload/images/20220918/20151112IAKV1cHLWt.png

  2. 貼上程式碼

    // 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 為這次的發送者
            }
        }
    }
    
  3. 編譯程式碼
    https://ithelp.ithome.com.tw/upload/images/20220918/201511120hGl0c6x0L.png

  4. 部署合約,ENVIRONMENT 選擇 「Injected Provider」,可以連結到 Metamask 的錢包(記得選擇測試鏈)

https://ithelp.ithome.com.tw/upload/images/20220918/20151112GMzr3x1wpl.png

  1. 按下「Deploy即部署至測試鏈」

https://ithelp.ithome.com.tw/upload/images/20220918/20151112dPPQaCezNN.png

  1. 部屬的行為也是一個交易,可至 etherscan 看到此交易,此交易中的「to」即為合約的地址
    https://ithelp.ithome.com.tw/upload/images/20220918/201511120cS0x73DDS.png

https://ithelp.ithome.com.tw/upload/images/20220918/20151112zqpjrQTnIk.png

  1. Metamask 切換其他帳號,並轉帳至此地址,此時就會觸發合約中的 receive 函數
    https://ithelp.ithome.com.tw/upload/images/20220918/20151112K4nSAi2zuU.png

    Untitled

  2. 現在回到 remix ,在 Deployed Contract 中可以點選變數,查看合約現在的狀態
    https://ithelp.ithome.com.tw/upload/images/20220918/201511122nJv1znL4Q.png

  3. 查詢結果可以發現這三個變數已經被改動了( _maxValue 的單位是 wei,所以是 0.1*10^-18)
    https://ithelp.ithome.com.tw/upload/images/20220918/201511122px6LpzDw2.png

  4. 若按下 「withdraw」,可以執行「withdraw」函數,若此時 Metamask 選擇的帳號不是當初部署合約的地址,會被 require 擋下
    https://ithelp.ithome.com.tw/upload/images/20220918/201511126rL5Wc6tqQ.png

    Untitled

  5. 以當初發布合約的地址去呼叫 「withdraw」,就會將功德箱內的所有代幣轉至此地址
    https://ithelp.ithome.com.tw/upload/images/20220918/20151112KRvhApYVzK.png


上一篇
[12] 什麼是智能合約
下一篇
數位資產交易所
系列文
Web3.0 來襲27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言