如何在乙太坊區塊鏈 (Ethereum Blockchain) 上以 Remix 撰寫智能合約 (Smart Contract),使用 ERC-20 發行加密貨幣並進行 ICO


上文"如何在區塊鏈 (Blockchain) 上使用 Remix 部署智能合約 (Smart Contract)",說明了在乙太坊區塊鏈上以Remix撰寫智能合約,也使用ERC-20發行加密貨幣,但是尚缺乏一個功能,就是以乙太幣購買該加密貨幣。

尋找了很多資源,終於找到這篇"Minting Your Own ERC-20 Tokens in Ethereum",裡面談到了Initial Coin Offering (ICO)

ICO的意思是「首次代幣發行」,也就是讓大家可以用乙太幣來購買我發行的加密貨幣,為何是乙太幣? 因為我們使用乙太坊區塊鏈,當然是先跟乙太幣做兌換。

以下是發行加密貨幣的合約內容 : 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyToken is ERC20, Ownable {
    uint256 public unitsOneEthCanBuy  = 10;
    address public tokenOwner;

    constructor() ERC20("MyToken", "MTK") {
        tokenOwner = msg.sender;       // address of the token owner        
        uint256 n = 1000;
        // mint the tokens
        _mint(msg.sender, n * 10**uint(decimals()));  
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    receive() external payable {        
        // msg.value (in Wei) is the ether sent to the
        // token contract
        // msg.sender is the account that sends the ether to the
        // token contract
        // amount is the token bought by the sender
        uint256 amount = msg.value * unitsOneEthCanBuy;
        // ensure you have enough tokens to sell
        require(balanceOf(tokenOwner) >= amount,
            "Not enough tokens");
        // transfer the token to the buyer
        _transfer(tokenOwner, msg.sender, amount);
        // emit an event to inform of the transfer        
        emit Transfer(tokenOwner, msg.sender, amount);
       
        // send the ether earned to the token owner
        payable(tokenOwner).transfer(msg.value);
    }
}


上鏈後的資料如下 : https://rinkeby.etherscan.io/address/0x2c72A65f7716471Ff0D90317ced648E8fB3e861D


然後,如果我們發送0.01 ETH到以上的合約地址,就可以購買這個加密貨幣 0.1 MTK,如下圖 :




由於這個合約呼叫外部檔案,所以如果要在鏈上做verify的動作,必須先做Flattener,如下圖 :



確認之後,在contract旁邊就會多出綠色的勾勾了。




在操作以上的過程中,其實不會很順利,會碰到以下的問題 :

(1) solidity版本的問題 : 合約內的版本跟編譯時選擇的版本不同時,有時會有問題,有時不會。
(2) 編譯及部署時會選錯檔案。
(3) 使用Flattener時,版權宣告會沒有加入,可能需要自己加入。
(4) 上鏈後要做Verify時,bycode是要用Flattener前或是後的版本? 後來發現Flattener後再上鏈比較好。

也許你會碰到更多的問題,把智能合約上鏈問題比較小,但是智能合約要做Verify就會碰到較多的問題,大多的問題會在ABI的部分,因此我們上面智能合約程式沒有使用constructor帶參數,因此做Verify應該會比較順利。

以下是操作過程的影片 :

Rinkeby測試網路,上鏈後的資料如下 : 

Ropsten測試網路,上鏈後的資料如下 : 



以上操作過程可以看到,把智能合約做Verify時,會有一些狀況,有時候不一定是你的問題,需要看給你的錯誤訊息是什麼。不過,重點是多操作幾個不同的智能合約,就會掌握到如何正確的編譯、部署、確認智能合約的一些眉角。

目前為止,我們都在 Rinkeby 測試網路上,那麼其他測試網路呢? 以下是四個測試網路的資源 :

Rinkeby測試網路
-- 取得測試幣 https://faucets.chain.link/
-- 查詢區塊鏈 https://rinkeby.etherscan.io/

Ropsten測試網路
-- 取得測試幣 https://faucet.egorfine.com/
-- 查詢區塊鏈 https://ropsten.etherscan.io/

Kovan測試網路
-- 取得測試幣 https://faucets.chain.link/
-- 查詢區塊鏈 https://kovan.etherscan.io/

Goerli測試網路
-- 取得測試幣 https://faucets.chain.link/
-- 查詢區塊鏈 https://goerli.etherscan.io/

你可以試試在多個測試網路上進行智能合約的編譯、部署、確認。看看跟Rinkeby測試網路有何不同。

[後記]

近期寫了幾篇跟區塊鏈有關的文章,從區塊鏈與資料庫的關係、區塊鏈與企業系統的關係、談到在乙太坊區塊鏈上如何部署智能合約,文章列表如下 :

什麼是區塊鏈 (Blockchain)? 可以取代資料庫嗎?

區塊鏈 (Blockchain) 在供應鏈 (Supply Chain) 與企業資源規劃 (ERP) 系統扮演什麼角色?

如何在區塊鏈 (Blockchain) 上使用 Remix 部署智能合約 (Smart Contract)

之所以會談這麼多區塊鏈的內容,實在是因為未來資料庫肯定跟區塊鏈綁在一起,企業系統也無法獨立於區塊鏈之外了。

最明顯的例子就是資料庫與系統的大咖,Oracle、Microsoft、IBM都有區塊鏈的產品,例如Oracle Blockchain是企業共用資料的解決方案、Microsoft Azure 區塊鏈提供多方商務流程中信任數位化的功能、IBM Hyperledger Fabric可以大規模提供效能並保留企業需要的資料隱私權、以及IBM的TradeLens區塊鏈的集裝箱物流解决方案。區塊鏈的不可竄改性 (immutability)、可追蹤性 (trackability)、無須信賴性 (trustlessness) 就是可以補強傳統系統的重要特性。

這些例子都說明企業系統、資料庫、區塊鏈三者密不可分的關係,因此學習區塊鏈技術以及各種協定,是非常重要的。

但是要理解區塊鏈應該怎麼學習? 最重要的就是不斷的實作,因為光是知道區塊鏈是區塊串起來,沒有從程式碼去理解雜湊函數的運作,會無法真正理解區塊鏈。因此前文用Python來實現區塊鏈,才知道原來要找到正確的隨機數(Nonce)這麼不容易。

然後從雜湊函數才讓區塊鏈具有不可竄改性 (immutability),從數位錢包的位址了解可追蹤性 (trackability) 與無須信賴性 (trustlessness) ,然後從實做 NFT (非同質性代幣,ERC-721) 到加密貨幣 (同質性代幣,ERC-20),才算把乙太坊區塊鏈的基本技術走過一遍 (只是一點基本技術,而非全部喔)。

很多人會覺得這些好複雜,光是打開 Remix IDE 就不知道從何下手了。其實問題都在兩個點 : 實作太少、疑問太多

需要多多實作還可以理解,為何「疑問太多」不好呢? 以 Remix IDE 為例,你不可能把 Remix IDE 裡面的每個項目都理解之後,再往下一站去進行。只要跟著實作跑過一次,成功了之後再閉著眼睛再跑一遍,都成功了再去挑出疑問去找答案。

在跟著實作的過程,會有很多疑問,為何 Environment 要選 Injected Web3? 為何不是 Web3 provider 或是其他 (答案在這裡)? 當你已經都會操作後,再回去找答案,而不是一開始就因為某個小東西不懂而無法前進。而且跑過一遍之後,再回去找答案,體驗會比較深刻。為何這樣會比較深刻? 這個就只能意會而無法言傳了,自己去感受吧。

通常「疑問太多」的人,都源自於「實作太少」。實作多了之後,不會因為小疑問卡著而無法前進,而會在實作成功之後,再回來補強疑問的地方。

簡單來說,就是先模仿別人的步驟成功之後,再回頭來搞清楚疑問,這樣會比較看得到全貌。


張貼留言

0 留言