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,所以每秒只能發送兩個請求
監聽合約 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
解決方法:
2.Metamask - "Params specify an EIP-1559 transaction but the current network does not support EIP-1559"
有些網路還沒升級到 EIP1559後版本,所以 metamask 有時呼叫 function 後會出現此錯誤。
解決方法:
add type: "0x1"
Last updated
Was this helpful?