Aufruf von Vertragsfunktionen nur mit ABI ohne Quellcode

Ich habe eine MyContract.json-Datei eines Vertrags (vorausgesetzt, ich habe den Quellcode nicht). In der .json-Datei gibt es abi und bytecode. Wenn ich einen solchen Vertrag (über web3js) bereitstellen möchte, habe ich folgende Probleme. Diese Frage wird jedoch komplexer, wenn es Tausende von Verträgen gibt, was meine letzte Aufgabe ist. Aber hier beschränke ich mich nur zum Verständnis auf nur einen Vertrag.

  1. Wenn ein solcher Vertrag einige Argumente in seinem Konstruktor benötigt, wie kann ich dann seine Parameter mit gültigen Werten kennen, damit er erfolgreich bereitgestellt werden kann.
  2. Wie kann ich seine verschiedenen Funktionen (Getter, Setter) aufrufen?

Zu Frage Nr. 1; Ich teile hier meinen Code für seine Bereitstellung. Es ist gültig und funktioniert, wenn der Vertrag einen Konstrukteur hat, der die Eigentümeradresse in seinem Parameter enthält. Dieser Code wird auf einem bekannten Vertrag mit Quellcode getestet. Wenn der Konstruktor jedoch keine Parameter oder andere Parameter oder viele andere Parameter verwendet, kann dieser Code nicht bereitgestellt werden , da ich eine gültige Anzahl von Parametern und gültige Werte übergeben muss.

var compiledContract = require('./build/MyContract.json');

async function deployCon() {

const contract = new web3.eth.Contract(compiledContract.abi);
const params = {
    data: '0x' + compiledContract.bytecode,
    arguments: [account1]
};
const transaction = contract.deploy(params); 
const options = {
    data: transaction.encodeABI(),
    gas: await transaction.estimateGas({from: account1})
};
// console.log(options)
const signed = await web3.eth.accounts.signTransaction(options, privateKey1);
receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction);
console.log(`Contract deployed at address: ${receipt.contractAddress}`);
return receipt;

}

Zu Frage Nr. 2; Ich bin völlig blind, wie man die hier als ??????? gezeigten Vertragsfunktionen aufruft. (was durch abi der .json-Datei zusammen mit Parametern bekannt wird!).

var  myContAddr = receipt.contractAddress;
    var myContractAbiDefenition = compiledContract.abi;
    var myContractInstance = new web3.eth.Contract(myContractAbiDefenition, myContAddr);
    await myContractInstance.methods.???????.send({from: account1, value: web3.utils.toWei(amount, 'ether')})

Antworten (1)

Zu deiner Frage Nr. 1: Suchen Sie "type": "constructor"in Ihrer ABI. Von diesem Objekt aus können Sie das sehen, inputsdas ein Array von Parametern zusammen mit ihrem Namen und Typ hat. Beispiel:

  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_ff",
        "type": "uint256"
      },
      {
        "internalType": "string",
        "name": "_name",
        "type": "string"
      }
    ],
    "payable": false,
    "stateMutability": "nonpayable",
    "type": "constructor"
  }

Im obigen Beispiel sehen Sie, dass der Konstruktor zwei Parameter hat: und _ffvom nameTyp uint256bzw.string

Zu Frage Nr. 2 : Sobald der Vertrag instanziiert ist, können Sie alle Methoden sowie die öffentliche Zustandsvariable mit protokollieren console.log(myContractInstance.methods).

Andernfalls können Sie nachsehen, ABIwo type ist function. Dies ist jedoch möglicherweise ein komplexerer Weg.

Aktualisiert:

let abi = JSON ABI;

for (let item of abi) {
    // this will return an array of constructor parameters along with their name and type
    if (item.type === "constructor") console.log(item.inputs);
    // result [{internalType: "uint256", name: "_ff", type: "uint256"}, {internalType: "string", name: "_name", type: "string"}]

    // this will return only the names
    // you can push the names into array
    // then iterate over the array to call them
    if (item.type === "function") console.log(item.name);
}

Hoffe es wird helfen.

Danke für deine Antwort. OK, aber wie extrahiert man den Konstruktor und seine Parameter aus einem so komplexen abi mit web3? ... es sollte für mich machbarer sein, wenn Sie es vorziehen, einen Beispielcode zu geben (da ich Neuling bin) ... Für die zweite Frage kann ich Methodennamen bekommen und sie drucken ... aber wie man sie einzeln aufruft wie myContractInstance.methods.MY_RETRIEVED_FUNCTION_NAME().send()
Bitte sehen Sie sich dieses Beispiel an, um die Methoden aufzurufen: web3js.readthedocs.io/en/v1.2.2/web3-eth-contract.html#id28
Ich glaube, ich konnte es nicht erklären ... Ich weiß, wie man eine Funktion aufruft ... aber wie man die verschiedenen Funktionsnamen anhängt (aus Methoden = myContractInstance.methods extrahiert) ... zum Beispiel gibt uns dies (myContractInstance.methods) eine Methode Name, dh setTotalSupply, das in Methoden[0] gespeichert wird, und getTotalSupply wird in Methoden[1] gespeichert. dann wie aufrufen (oder diese extrahierten Namen an myContractInstance.methods anhängen. ------. send()
Ich verstehe nicht, was du mit anhängen meinst. Wenn Sie den Namen der Methode kennen, sagen wir setTotalSupply, nennen Sie sie einfach als myContractInstance.methods.setTotalSupply().call().
Ich meine, wenn ich var Methoden = myContractInstance.methods aufrufe, werden alle Methodennamen in Methodenvariablen gespeichert. dann wie man Namen von Methoden aus der Variablen 'methods' abruft und dann rufe ich zB myContractInstance.methods.methods[0].send () // Ich weiß, dass dies nicht funktionieren wird, aber ich möchte dynamisch (Laufzeit) method[ aufrufen 0] sollte durch tatsächliche Namen ersetzt werden ...
var methods = myContractInstance.methodsDadurch werden nicht nur die Funktionsnamen, sondern auch die Funktionssignaturen gespeichert. var methodswird auch ein Objekt sein. Sie können also ein Array mit erhalten Object.keys(methods). Dieses Array enthält jedoch sowohl Funktionsnamen als auch Signaturen. Sobald Sie nur Funktionsnamen haben, können Sie über das Array iterieren.
danke, ich werde es versuchen ... aber meine vorherige frage "wie extrahiert man den konstruktor und seine parameter aus einem so komplexen abi mit web3, javascript? wird noch erwartet, wenn sie eine idee haben, ich werde ihnen dankbar sein ...
Bitte sehen Sie sich die aktualisierte Antwort an.