Web3js

如何在沒有已知 ABI 的情況下通過 Web3/Nethereum 與智能合約互動

  • May 29, 2021

假設我使用的是 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();

引用自:https://ethereum.stackexchange.com/questions/99310