Remix IDE + Ganache vs. Trüffel + Ganache

Ich habe ein Problem bei der Migration eines Smart Contracts von Truffle in Ganache. Wenn ich jedoch denselben Smart Contract von Remixder 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.jsonDatei 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
    }
  }
};

Antworten (1)

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.

  1. Stellen Sie sicher, dass Sie sich mit demselben Netzwerk oder Emulator verbinden (mit der richtigen Netzwerk-ID).
  2. Wenn Sie Truffle verwenden, stellen Sie sicher, dass Sie das Truffle-Artefakt verwenden (Vertrag über Truffle zusammenstellen)
  3. Wenn Sie Web3js verwenden, sollte die ABI des Vertrags ausreichen, um den Vertrag zu instanziieren

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 ...
Das ist eigentlich, was ich tue. 1. Bereitstellen des Vertrags für Ganache aus Remix IDE, 2. Kompilieren des Vertrags in Truffle und Verwenden von artifatcs.json zum Instanziieren des Vertrags. In Truffle Console erhalte ich jedoch diesen Fehler, wenn ich manuell eine Funktion eintippe (ContractOne.deployed().then()....).
Sie müssen keine deployedFunktion ausführen. Sie sollten so etwas wie var instance = await ContractOne.at(<address>);Ich werde ein Beispiel als Antwort geben
Vielen Dank für das Beispiel! Ich habe genau die React-Komponente bereitgestellt, mit der ich Probleme habe. Ich versuche, Ihren Code darin zu integrieren, aber es scheint, dass eine asynchrone Funktion benötigt wird, die ich nicht verstehen kann, wie man sie einbindet. könntest du bitte einen Blick auf den Code der React-Komponente werfen?
Sie haben die Logik von nicht verstanden getAccount, Sie möchten ein Konto erhalten, aber gleichzeitig einen Vertrag instanziieren und keine Instanz des Vertrags verwenden. Sie können getAccountals markieren async, müssen aber awaitdrin sein
Ich habe es geschafft, den Code nach Ihrem zu ändern, und wenn die Komponente montiert wird, bekomme ich immer noch:Uncaught (in promise) Error: Contract has not been deployed to detected network (network/artifact mismatch)
Könnten Sie den obigen Code aktualisieren und die Truffle-Konfiguration teilen?
Beitrag aktualisiert.