Web3js
如何在沒有已知 ABI 的情況下通過 Web3/Nethereum 與智能合約互動
假設我使用的是 Web3 或 Nethereum,這兩者顯然都需要合約的 ABI 來綁定函式。
不知道完整的 ABI 就沒有辦法呼叫智能合約功能嗎?如果我只知道智能合約地址和函式名稱/參數怎麼辦?
提前致謝!
我不確定 Web3 或 Nethereum,但 ethersjs 允許您在建構合約對象時手動輸入合約的函式(前提是您知道函式名稱/參數本身,以及它們在實際 ABI 中的樣子)。根據他們的教程:
您可以放心地忽略任何您不需要或不使用的方法,為合約提供一個較小的 ABI 子集。
您可以使用 Etherscan API。他們有一個端點,可以讓你獲得指定的合約 ABI。您需要先註冊並獲取 api 密鑰,然後才能開始發送請求,但它是免費的。還需要驗證契約才能使其正常工作。
註冊後,假設您使用的是 c#,您可以使用以下程式碼獲取 ABI:
var client = new HttpClient(); var contractAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413"; var apiKey = "My-Api-Key"; using (client) { var abiResponse = await client.GetAsync($"https://api.etherscan.io/api?module=contract&action=getabi&address={contractAddress}&apikey={apiKey}"); var contractAbi = await abiResponse.Content.ReadAsStringAsync(); }
你可以用js做同樣的事情。
const https = require('https'); const contractAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413"; const apiKey = "your-api-key"; const endpoint = `/api?module=contract&action=getabi&address=${contractAddress}&apikey=${apiKey}`; var options = { host: 'api.etherscan.io', path: endpoint, method: 'GET', headers: { 'Content-Type': 'application/json' } }; async function getContractAbi() { let request = https.get(options, (res) => { if (res.statusCode !== 200) { console.error(`Did not get an OK from the server. Code: ${res.statusCode}`); res.resume(); return; } let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('close', () => { console.log('Retrieved all data'); console.log(data); }); }); request.on('error', (err) => { console.error(`Encountered an error trying to make a request: ${err.message}`); }); } getContractAbi();