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.
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')})
Zu deiner Frage Nr. 1: Suchen Sie "type": "constructor"
in Ihrer ABI
. Von diesem Objekt aus können Sie das sehen, inputs
das 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 _ff
vom name
Typ uint256
bzw.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, ABI
wo 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.
Emir Ali
Yahya
Emir Ali
Yahya
setTotalSupply
, nennen Sie sie einfach alsmyContractInstance.methods.setTotalSupply().call()
.Emir Ali
Yahya
var methods = myContractInstance.methods
Dadurch werden nicht nur die Funktionsnamen, sondern auch die Funktionssignaturen gespeichert.var methods
wird auch ein Objekt sein. Sie können also ein Array mit erhaltenObject.keys(methods)
. Dieses Array enthält jedoch sowohl Funktionsnamen als auch Signaturen. Sobald Sie nur Funktionsnamen haben, können Sie über das Array iterieren.Emir Ali
Yahya