Ich habe ein Problem bei der Migration eines Smart Contracts von Truffle in Ganache
. Wenn ich jedoch denselben Smart Contract von Remix
der IDE MetaMask
über in ausführe Ganache
, funktioniert alles einwandfrei.
Um den Migrationsfehler zu umgehen, dachte ich daran, die Remix IDE ABI.js-Datei anstelle der Contract.json
Datei zu verwenden, die Truffle kompiliert. Allerdings bekomme ich einen Fehler:
Der Vertrag wurde nicht für die erkannte Nichtübereinstimmung im Netzwerk (Netzwerk/Artefakt) bereitgestellt.
Ich kann nicht verstehen, warum der Vertrag funktioniert, wenn ich Form Remix bereitstelle und damit in Remix interagiere, und nicht, wenn ich die von Remix generierte ABI in meinen Web3js-Funktionen verwende?
UPD: Dies ist die React-Komponente (basierend auf Truffle React-Boilerplate), mit der ich zu arbeiten versuche. Hier ist ContractOne.json diejenige, die von generiert wird truffle compile
. Hätte die Trüffelmigration richtig funktioniert, hätte dies funktioniert.
import React, { Component } from "react";
import ContractOne from "../../../build/contracts/ContractOne.json";
import getWeb3 from "../../utils/getWeb3";
export class Main extends Component {
constructor(props) {
super(props);
this.state = {
web3: null,
account: ""
};
}
componentWillMount() {
getWeb3
.then(results => {
this.setState({
web3: results.web3
});
this.getAccount();
})
.catch(() => {
console.log("Error finding web3.");
});
}
async getAccount() {
const contract = require("truffle-contract");
const contractone = contract(ContractOne);
powerether.setProvider(this.state.web3.currentProvider);
let instance = await contractone.at(
"CONTRACT ADDRESS"
);
this.state.web3.eth.getAccounts((error, accounts) => {
instance => {
return this.setState({ account: accounts[0] });
};
});
});
}
render() {
return (
<div className="screen-one">
<div className="h1">{this.state.account}</div>
</div>
);
}
}
truffle.js
module.exports = { // Sehen // Weitere Informationen zum Anpassen Ihrer Truffle-Konfiguration! Netzwerke: { Entwicklung: { Host: "127.0.0.1", Port: 7545, network_id: "*" // Übereinstimmung mit einer beliebigen Netzwerk-ID } } };
Normalerweise habe ich damit keine Probleme, ich stelle Verträge über Remix bereit und kommuniziere von dapp über Truffle+Web3js. Sogar manchmal wird Truffle nicht benötigt (z. B. keine Unit-Tests), dann verwende ich nur Web3js.
AKTUALISIEREN Truffle+Web3js
import contract from 'truffle-contract';
import ContractOne from './../../build/contracts/ContractOne.json';
const contractOne = contract(ContractOne);
contractOne.setProvider(web3.currentProvider);
var instance = await contractOne.at(<address>);
var balance = await instance.getBalance(); // call functions ...
Ruham
Adler
deployed
Funktion ausführen. Sie sollten so etwas wievar instance = await ContractOne.at(<address>);
Ich werde ein Beispiel als Antwort gebenRuham
Adler
getAccount
, Sie möchten ein Konto erhalten, aber gleichzeitig einen Vertrag instanziieren und keine Instanz des Vertrags verwenden. Sie könnengetAccount
als markierenasync
, müssen aberawait
drin seinRuham
Uncaught (in promise) Error: Contract has not been deployed to detected network (network/artifact mismatch)
Adler
Ruham
Adler