Ich habe also einen bereitgestellten Vertrag mit Adresse0. Ich kann einfach damit interagieren, indem ich meine index.html wie folgt verwende:
import contract_artifacts from '../../build/contracts/contract.json'
var contract0 = contract(contract_artifacts);
Dann kann ich seine Funktionen so aufrufen:
contract0.deployed().then(function(something){});
Aber ich habe auch einen anderen zuvor bereitgestellten Vertrag mit Adresse1. Der Vertrag ist derselbe wie der Vertrag mit der Adresse0. Ich sehe nur eine Möglichkeit, mit dem Vertrag1 zu arbeiten:
var abiarray = [ here goes pretty big abi ];
contract1 = web3.eth.contract(abiarray).at(address1);
Gibt es eine andere Möglichkeit, dies zu tun, ohne das gesamte abi des Vertrags aufzunehmen? Da ich es bereits in contract_artifacts habe, weiß ich nur nicht, wie ich es von dort bekomme. Danke dir.
Ich weiß, die Frage ist alt, aber ich hatte einige Probleme damit, also werde ich teilen, was mir geholfen hat.
Um die ABI aus einer JSON-Datei zu importieren, können Sie den folgenden Code verwenden (vorausgesetzt, Sie haben bereits Ihr web3-Objekt):
var fs = require('fs');
var jsonFile = "pathToYourJSONFile/project.json";
var parsed= JSON.parse(fs.readFileSync(jsonFile));
var abi = parsed.abi;
var YourContract= new web3.eth.Contract(abi, 0x12345678912345678912345678912345678912);
Sie können hier mehr darüber lesen: https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html
Update 01/2020: Seit Typescript 2.9 wird das Lesen von JSON-Dateien direkt unterstützt. Wenn Sie also versuchen, den ABI oder Bytecode aus einem Typescript-Projekt (Angular, React, ...) zu erhalten, gehen Sie einfach zu Ihrer tsconfig.json und setzen Sie:
{
"compilerOptions": {
"resolveJsonModule": true,
"esModuleInterop": true
}
}
Mit kannst du dann import ContractName from 'path/to/contract/ContractName.json'
deine Verträge importieren und bekommst das Abi mit ContractName.abi
.
Beifall
Ich habe die require-Funktion verwendet, um die JSON-Datei zu importieren.
import Web3 from 'web3';
const web3 = new Web3(window.web3.currentProvider);
const { abi } = require('./smart_contract_after_compilation_step.json');
var smart_contract_interface = new web3.eth.Contract(abi, '0x5E54780072f1998FB85c3203D9697ef9E3F82DF0')
Im Frontend mache ich das einfach:
import MyContract fom './contracts/MyContract.json'; //truffle project dir
web3 = new Web3(Web3.givenProvider);
const myContractWeb3 = new web3.eth.contract(MyContract.abi, "0x00");
// and then call the function that I want to
const functionThatIWantToUseFromSmartContract = async () =>{
const account = await window.ethereum.enable();
const accounts = account[0];
const gas = await
myContractWeb3.methods.theFunction(args).estimateGas();
await myContractWeb3.methods.theFunction(args).send();
}
Das Lesen von JSON-Dateien wird direkt unterstützt. In meinem habe Nodejs Express App
ich den Vertrag geladen:
// Load Contract
var fs = require('fs');
var jsonFile = "abis/abi.json";
var abi = JSON.parse(fs.readFileSync(jsonFile));
// Contract
var contract = new web3.eth.Contract(abi, "0x068_your_address");
Richard Fu
Mark55
Error: Cannot find module '../../node_modules/file-system'
- obwohl ich absolutfile system
installiert habe - sowohl global als auch lokal im Ordner meines Projekts ... Seltsamerweise sagt der Fehler, dass er in Zeile 210 vonweb3.min.js
steht - was meiner Meinung nach nicht damit zusammenhängt. Gedanken?