去中心化的區塊鏈虛擬貨幣是唬爛的 - ERC-20 後門實戰
前一篇文中,我們使用了 Solidity 實作 ERC 20 代幣,當時我們提到了區塊鏈的虛擬貨幣,其實就只是在 EVM 中的一個 map (類似 Python 的 Dictionary),裡面儲存了位址以及金額。 而 ERC 20 標準,只需要符合指定的 Interface,講白話文就是,僅需要 Implement 指定的幾個 Function,就能發行一個新的虛擬貨幣。 然而,這會有兩個明顯的問題,首先,我們只需要依照標準定義 function 的名稱、輸入、輸出就可以符合 ERC 20 的標準,這邊並沒有限制任何的 function 內容需要怎麼實作,這意味著我們可以自己幫 Function 加料,例如在 Function 中埋藏一些後門。 另外,我們也可以在同一個 Contract 中,額外實作標準以外的其他 Function 來達成我們希望的功能,做這兩件事情,都依然是一個合法、符合 ERC 20 標準的代幣。 為了避免重造輪子,事實上我們可以直接 import 由 OpenZeppelin 提供的 Library 來進行繼承或是修改,OpenZeppelin 也提供了很多擴充功能可以使用。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; 舉例來說,我們想要發行一個後門幣 (Back Door Coin, BDC) 的話,僅需在合約的 Constructor 定義我們初始需要鑄造多少顆幣,預設的 decimals 是 18,也就是真正的貨幣金額會是 Balance 值 *10^-18,以避免浮點誤差。 ...