去中心化的區塊鏈虛擬貨幣是唬爛的 - 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,以避免浮點誤差。 ...

2023-01-05 · 3 分鐘 · steven

一起來用 ERC-20 發行垃圾幣吧!

只要建立了 ERC-20 標準的合約,就可以自動相容各種 ERC-20 代幣的軟硬體錢包,交易所等,事實上,只需要寫約 100 行的 Code 就能自己發行代幣,也可以很輕易的在這些合約 Code 內留下後門來做壞壞ㄉ事。 Interface 為了能夠把常見的介面給定義清楚, Solidity 有 interface 的功能。所有的函式必須是 External,即使最後宣告時使用 public。 一個 ERC20 的介面必須有 2 個事件以及 6 個函式 interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function approve(address spender, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function transferFrom(address from, address to, uint256 amount) external returns (bool); } totalSupply 可以回傳代幣的總發行量,通常會使用狀態變數 _uint256 _totalSupply 來儲存。 ...

2022-12-26 · 7 分鐘 · steven

既不智能,又不是合約的智能合約 - Solidity

智能合約並不智能,也不是合約,它只是可以執行在 EVM (Ethereum Virtual Machine) 中的一段 ByteCode 而已。之所以叫這個名字應該只是比較潮ㄅ,而且我覺得「智能」還有一點支語的味道,但在台灣也很少聽到「智慧型合約」這種說法。 合約不會自動執行,也不會自動結算跟驗證之類的事情,如果需要執行合約內的 Function,需要呼叫指定的 Transaction。 Account 在 Ethereum 底下,有兩種的 Account,分別是具有 Contract Code 的 Contract Account 以及沒有 Contract 的 EOA (External Owned Account)。 創建 Contract 需要使用到 EOA,且 Contract Account 比起 EOA 增加了 Storage hash 以及 Code hash 的欄位。 在 EOA 底下,總共有三種 Transaction 轉 Ether 部署 Contract 呼叫 Contract 裡面的特定 Function 在進行轉 Ether 的 Transaction 時,總共會有 4 個欄位:From, To, Value 以及 Data,其中,Data 為備註欄位,可以填入任意值。 而透過 EOA 執行部屬 Contract 時,在做的事情跟轉 Ether 一樣,同樣需要填入上述的 4 個欄位。只是 To 需要留空,只要 To 留空就代表該筆 Transaction 是 Create New Contract。 而 Data 欄位則輸入填入 Byte Code, Value 則可以塞一些 Ether 進入合約內。 ...

2022-12-26 · 4 分鐘 · steven