白名單機制

白名單機制

目前有三種做法,以下先談到搭配後端與合約的簽名驗證做法

1. 後端簽名,合約驗證

1.生成私鑰和對應地址:首先,你需要生成一對以太坊私鑰和公鑰,然後從公鑰導出對應的以太坊地址。這個地址將被用於識別簽名者。重要的是,私鑰必須保密,只能由授權的個人或系統持有。

2.將地址設置為合約中的root:在部署或初始化智能合約時,你需要將這個生成的以太坊地址設置為合約中的root變量。這個地址代表了被授權進行特定操作(如白名單鑄幣)的實體。

3.在後端使用私鑰進行簽名:在後端,當用戶請求鑄造代幣時,你需要使用私鑰對用戶的地址或其他相關數據進行簽名。這個簽名後續會被用戶提交給智能合約。

4.在智能合約中驗證簽名:當智能合約接收到用戶提交的簽名時,它會使用hash.recover(signature)方法從簽名中恢覆出地址,並檢查這個地址是否與存儲在root中的地址相匹配。如果匹配,則驗證成功,表明簽名是由持有對應私鑰的實體生成的,用戶便被授權進行鑄幣操作。

後端

生成簽名

function backendSign(address, contractName) {
  try {
    const messageHash = web3.utils.soliditySha3(
      { type: "address", value: address }, // 發出交易的人的地址
      { type: "string", value: contractName } // 合約的名稱
    );
    const signature = EthCrypto.sign(
      identity.privateKey, // privateKey
      messageHash // hash of message
    );
    return signature; // 填入 mint 交易的簽名
  } catch (err) {
    return "address not valid"
  }
}

合約端

呼叫 mint 時傳入後端生成的簽名

Merkle Tree 方式

產生 root

產生 proof

用戶發送 mint 前,瀏覽器用個別地址跟 API Server 獲取 proof

contract

可用以下 Node.js 腳本測試

記得 leaves 至少要一個以上,不然 getProof 會回傳空 array

在 Node 端 verify 時要用 getHexProof 只用 getProof,但如果是要給合約的 proof 要用 byte32 格式,所以要用 getHexProof

實際合約與測試

Hardhat 測試

whitelist.sol

test.js

Last updated

Was this helpful?