Wie stelle ich einen Vertrag bereit und rufe ihn auf? Adresse vorher benötigt?

Ich möchte eine Zeichenfolge aus einem Skript in node.js in Blockchain speichern. Das ist der Vertrag.

pragma solidity ^0.4.0;

contract SimpleStorage {
    string storedData;

    function set(string x) {
        storedData = x;
    }

    function get() constant returns (string) {
        return storedData;
    }
}

Um den Vertrag im Netz bereitzustellen (in meinem Fall Testnet), muss ich eine Instanz des Vertrags erstellen. Um eine Instanz zu erstellen und bereitzustellen, benötige ich 3 Dinge: web3-Bibliothek, abi und Vertragsadresse:

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abi = JSON.parse(....)  //==> I got abi following this tutorial(https://medium.com/@mvmurthy/full-stack-hello-world-voting-ethereum-dapp-tutorial-part-1-40d2d0d807c2)
StoreContract = web3.eth.contract(abi);
contractInstance = VotingContract.at('CONTRACT ADDRESS');
//And now I can use contract function
contractInstance.set(string data)

Also meine Frage ist....Wie bekomme ich die Vertragsadresse???

In dem hier geposteten Code contractInstance = VotingContract.at('CONTRACT ADDRESS');sollte es StoreContractnicht seinVotingContract

Antworten (1)

Sie benötigen Adresse und ABI, um einen Vertrag abzuschließen. Bevor Sie einen Vertrag aufrufen, müssen Sie ihn bereitstellen. Sie haben nur die abi-Definition. Sie müssen den Vertrag bereitstellen, indem Sie ihn abbauen lassen und die Adresse abrufen. Verwenden,

var simpleStorage = StoreContract.new(your_parameters ,{from:web3.eth.accounts[0], data: compiled_code , gas: gas_amount}, call_back_function)

Sobald der Vertrag abgebaut ist, wird er so etwas zurückgeben,

Contract mined! address: contract_address 

wo Sie die Vertragsadresse unter contract_address finden können

Sehen Sie sich das einfache Greeter-Beispiel auf der Ethereum-Website an, um eine detaillierte Erklärung zum Beginnen mit Smart Contracts zu erhalten.

UPDATE-1:

Wenn Sie den Blogbeitrag , auf den Sie verwiesen haben, sorgfältig lesen, ist klar, dass Sie eine Transaktion senden müssen, damit der Vertrag bereitgestellt werden kann. (Er enthält auch einige schöne Diagramme).

Dies ist das Code-Snippet aus dem Blogbeitrag,

abiDefinition = JSON.parse(compiledCode.contracts[':Voting'].interface)
VotingContract = web3.eth.contract(abiDefinition)
byteCode = compiledCode.contracts[':Voting'].bytecode
  // the following line is what you need to do get the address
deployedContract = VotingContract.new(['Rama','Nick','Jose'],{data: byteCode, from:
web3.eth.accounts[0], gas: 4700000}) 
deployedContract.address
contractInstance = VotingContract.at(deployedContract.address)

und nach dem was du gepostet hast,

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
abi = JSON.parse(....)  //==> I got abi following this tutorial(https://medium.com/@mvmurthy/full-stack-hello-world-voting-ethereum-dapp-tutorial-part-1-40d2d0d807c2)
//at this point you need to send the transaction using "StoredContract.new(params,transaction details, callback[optional]);"  
StoreContract = web3.eth.contract(abi);
contractInstance = VotingContract.at('CONTRACT ADDRESS');

Sie benötigen keine Adresse, um einen Vertrag bereitzustellen, Sie müssen nur eine Transaktion mit den Vertragsdetails senden. Sobald der Vertrag bereitgestellt ist (nachdem die Transaktion abgebaut wurde), wird die Adresse ausgegeben, mit der Sie die jeweilige Instanz anrufen können.

UPDATE-2:

Sie können viele Instanzen desselben Vertrags bereitstellen, indem Sie Transaktionen senden, und diese werden an verschiedenen Adressen gespeichert. Sie können eine bestimmte Instanz mit der entsprechenden Adresse verwenden (z. B. um in Ihrem Fall eine Funktion wie setter aufzurufen). Siehe die folgende Antwort, die hier veröffentlicht wurde .

So wie Code in Quellform vorliegen oder in ausführbare Form konvertiert/kompiliert werden kann, gilt dasselbe für Verträge.

Aus dem Quellcode können viele Kopien der ausführbaren Form generiert werden.

In Quellcodeform ist ein Vertrag in Solidity wie eine Klasse in OOP-Begriffen: Er kann viele Male instanziiert und von ihm geerbt werden.

Einen Vertrag ausführbar zu machen, umfasst normalerweise 2 Schritte:

Konvertieren der Quelle in Ethereum Virtual Machine (EVM) Bytecode Bereitstellen der EVM in einer Ethereum-Blockchain Derselbe Vertragsquellcode oder EVM kann viele Male in einer Blockchain bereitgestellt werden. Jede Instanz eines bereitgestellten Vertrags hat eine eindeutige Adresse.

Ok, ich werde es versuchen, danke. Nur letzte Frage: Ist der Vertrag in Ordnung? Ich habe irgendwo gelesen, dass es ein Problem mit den String-Parametern geben könnte
Nein, warten Sie
Ich verwende TestRPC fwi
Ich denke, es wird in dem Blogbeitrag, auf den Sie hier verwiesen haben, deutlich erwähnt . Lassen Sie mich die Antwort zum Blog-Beitrag aktualisieren.
Also ... (nur um sicherzugehen, dass ich Sie verstanden habe) kann ich nach der Bereitstellung diese Adresse verwenden, um eine neue Instanz meines Vertrags zu erstellen?
Eine Instanz eines Vertrages wird an einer bestimmten Adresse bereitgestellt. Sie können viele Instanzen an verschiedenen Adressen initiieren. Was Sie mit der Adresse tun, ist das Aufrufen dieser bestimmten Instanz
Ich habe die Antwort erneut aktualisiert
Ok, also kann ich nicht tun, was ich dachte ... Ich muss einige Daten, die in einer Zeichenfolge enthalten sind, in einem js-Skript an den Vertrag übergeben. Also muss ich eine Instanz des Vertrags in meinem Skript aufrufen und die Funktion verwenden set,like this contractInstance.set(string data) Ich dachte, ich könnte diese Adresse für eine neue Instanz meines Vertrags verwenden, aber wie Sie sagten, bezieht sich die Adresse auf diese bestimmte Instanz ... Also, wie könnte ich das machen? ( Entschuldigung für die Doppelfrage..)
bis jetzt habe ich alle zeilen von cmd geschrieben. Könnte ich diese var simpleStorage = StoreContract.new(your_parameters ,{from:web3.eth.accounts[0], data: compiled_code , gas: gas_amount}, call_back_function) im js-Skript verwenden? Verwenden meiner Zeichenfolge "data" als "your_parameters)
Wie würde dieser Code funktionieren, wenn wir "Truffle Compile" oder "Truffle Deploy" verwenden würden? Ich kann Dinge für neue Instanzen zum Laufen bringen. Aber wenn ich versuche, von einer Adresse zu laden, funktioniert nichts.
wie bekomme ich das abi eines öffentlich bereitgestellten vertrages für dessen adresse ich erst jetzt von etherescan ?