web3.js 使用

目前主流的 ETH 測試網路為 Sepolia

v1.0 有 API更改,以下以 v1.0 為主

初始化 Web3.js

v4 版本需要用以下方式引入

const { Web3 } = require("web3");
const web3 = new Web3();

初始化合約

if (window.ethereum) {
  window.web3 = new Web3(window.ethereum); // 參數內填入 provider
  window.ethereum.enable();
}
try {
  var web3 = window.web3;
  var web3 = new Web3(web3.currentProvider);
} catch (err) {
  alert("Please install Metamask first");
  // window.location =
  //   "https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn";
}

const ContractERC721 = new web3.eth.Contract(ERC721.ABI, ERC721.address);
window.ContractERC721 = ContractERC721;

執行不需要交易的 function

Big Number

建議改用 npm: bignumber.js,多了很多錯誤處理。

監聽帳戶轉帳交易

這邊使用 Alchemy API

免費幣水龍頭:https://sepoliafaucet.com/

新增 Alchemy APP: https://dashboard.alchemy.com/apps

Pending Transaction

https://docs.alchemy.com/reference/alchemy-pendingtransactions

Mined Transaction (confirmed transaction)

獲取帳戶歷史交易

Alchemy SDK 的 rate limit 用 CUP 計算,免費帳戶的 CUP 為 330 / sec,而 getAssetTransfers 耗費 150 CUP,所以每秒只能發送兩個請求

https://docs.alchemy.com/reference/pricing-plans

監聽合約 Event

記得 infura 的測試網路 url 要填對,例如 Rinkeby 不要寫成 ropsten

後端使用ECDSA 簽名與驗證

使用 createIdentity 產生私鑰與公鑰,並且公鑰產生地址,之後用私鑰簽名(sign)然後用 recovery 還原出簽名的地址。

前端使用簽名與驗證

只有前端能用 eth.personal

使用後端驗證前端的簽名,使用 eth-sig-util 模組

或是使用 eth-crypto 模組

有時看到前端簽名的內容是比較格式化的,可以參考:sign-typed-data-v4

https://docs.metamask.io/guide/signing-data.html#sign-typed-data-v4

重新整理與初始化頁面時的 web3 地址顯示與簽名

建立 raw transaction

建立交易但不廣播:

web3.js 版本

ether.js 版本

後端使用私鑰發送轉帳交易

轉帳交易的話 tx 內容改如下即可

如果出現 Invalid sender 的話記得檢查下 web3 rpc url 跟 chainid 有沒有對應:

單位換算

建議可以用 bignumber.js

不同 ERC-20 合約 token 有不同的 decimals,例如 USDC 為 6,大部分為 18 等等。

讀取合約餘額然後到網頁顯示

今天讀取到合約的 balanceOf 後會需要除以 decimals,例如 balance / 1e18

換算回原本的精度然後寫回合約

如果今天合約是要 deposit ,並且用原本 token 的精度的話,已經除以 1e18 的數字可以如下返回原本的精度,然後寫回合約,記得要用 bigNumber,不然 js 會有問題。

Approve max allowance

address spend other address's ERC20 token

從後端私鑰發送合約交易

轉換 blockNumber 為 timestamp

轉為 UTC +8

獲取合約 event 歷史

注意事項

1.使用 CRA 5 版本以上引入 web3 會出現 error

https://stackoverflow.com/questions/70472965/web3-issue-react-application-not-compiling/70512623#70512623

解決方法:

2.Metamask - "Params specify an EIP-1559 transaction but the current network does not support EIP-1559"

有些網路還沒升級到 EIP1559後版本,所以 metamask 有時呼叫 function 後會出現此錯誤。

解決方法:

add type: "0x1"

https://ethereum.stackexchange.com/a/119863

Last updated

Was this helpful?