So laden Sie die Solidity-Quelldatei in Geth

Ist es möglich, die Solidity-Quelldatei .solin go-ethereum.

Ich verwende die Methode „loadScript“, indem ich eine .jsDatei wie die folgende speichere und lade.

source = "contract test {\n" +
"   /// @notice will multiply `a` by 7.\n" +
"   function multiply(uint a) returns(uint d) {\n" +
"      return a * 7;\n" +
"   }\n" +
"} ";

Gibt es einen besseren Weg? Ich möchte nicht verwendenbrowser-solidity

Antworten (2)

Ich habe diesen Solidity Compile Helper Ruby Wrapper gefunden

Verwendungszweck

solc_helper contract.sol

Dadurch wird eine Javascript-Datei generiert und eine Anweisung wie die folgende ausgegeben.

loadScript('/path/contract.js')

Fügen Sie diese Anweisung in die Geth-Konsole ein. Ihr Code wird geladen und Ihr Vertrag wird automatisch bereitgestellt.

Es gibt auch ein paar Hilfsfunktionen, um die Verträge einfach bereitzustellen.

Aktualisierung 3. Januar 2017

Beachten Sie, dass der Solidity 4.7-Compiler unterschiedlichen Code für denselben Vertrag erstellt, wenn Sie unterschiedliche Leerzeichen haben. Dies ist wichtig, wenn Sie versuchen, verifizierte Quellen in den Blockchain-Explorern hinzuzufügen, da die kompilierte Quelle mit dem bereitgestellten Code übereinstimmen muss. Möglicherweise möchten Sie erwägen, Ihre Verträge auf der Mainnet- oder Testnet-Blockchain mit Browser Solidity oder Ethereum Wallet / Mist bereitzustellen, anstatt die gethBefehlszeile zu verwenden.

Aus dem obigen Link:

pragma solidity ^0.4.7; contract Test { }  

produziert:

6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a7230582083d1e44aa5fc6707310b1b2f2f853c4fe7a55c7d9d7f5fd00699d97527c4fe4a0029

Und

pragma solidity ^0.4.7; contract Test {}  

produziert:

6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a723058204687f46477038e9c93d271aa664f966bf84275743951a45d1f7b801daafe15ae0029

Das ist wegen:

Ich glaube, diese zusätzlichen 32 Bytes sind der Swarm-Hash der Metadatendatei, die Solidity generiert. Siehe die Versionshinweise für 0.4.7 . Die Code-Kommentare erklären, was vor sich geht.

Ich stimme zu, dass es sich um ein unerwartetes Verhalten bei Whitespace-Änderungen handelt, aber beachten Sie, dass es bei der Überprüfung des Quellcodes helfen soll und nicht behindert (siehe Kommentare im Code unter Verwendung für die Überprüfung des Quellcodes ).



Unter Linux (funktioniert auch in Cygwin) habe ich ein einfaches Perl-Skript erstellt, um das CRLF zu entfernen und Leerzeichen zu komprimieren, die ich als $HOME/bin/stripCrLf speichere:

#!/usr/bin/perl
while (<>) {
  chomp;           # Remove newline
  s#/\*.*?\*/##sg; # Remove multiline comments
  s/\/\/.*$//go;   # Remove // comments
  s/\s+/ /go;      # Collapse space
  print;
}
print "\n";

Sie müssen den folgenden Befehl ausführen, um den Befehl ausführbar zu machen:

chmod 700 $HOME/bin/stripCrLf

Ich habe den folgenden Code, den ich von https://gist.github.com/alexvandesande/259b4ffb581493ec0a1c ausgeliehen habe, in random.sol gespeichert.

contract random {
    /* Generates a random number from 0 to 100 based on the last block hash */
    function randomGen(uint seed) constant returns (uint randomNumber) {
        return(uint(sha3(block.blockhash(block.number-1), seed ))%100);
    }

    /* generates a number from 0 to 2^n based on the last n blocks */
    function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) {
        uint n = 0;
        for (uint i = 0; i < size; i++){
            if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0)
                n += 2**i;
        }
        return n;
    }
}

Ich kann dann den folgenden Befehl in einem Linux-Terminal ausführen:

beefee@Kumquat:~$ echo "var randomSource='`stripCrLf random.sol`'"
var randomSource='contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}'

Ich mache dann einen Dreifachklick auf die Ausgabezeile und füge sie in die Geth-Befehlszeile ein:

> var randomSource='contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}'
undefined
> randomSource
"contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}"
> I0309 08:26:32.300483 miner/worker.go:349] 🔨 Mined block (#53 / 7892a72e). Wait 5 blocks for confirmation
> var randomCompiled = web3.eth.compile.solidity(randomSource)
I0309 08:31:53.168772 miner/worker.go:570] commit new work on block 76 with 0 txs & 0 uncles. Took 262.261µs
...
> randomCompiled
{
  random: {
    code: "0x606060405260978060106000396000f3606060405260e060020a600035046341fa487681146024578063434b14e714606b575b005b6085600435602435600080805b83811015608f574381900360001901406060908152608086905260409020600290068314156064578060020a8201915081505b6001016031565b436000190140606090815260043560805260409020606490065b6060908152602090f35b50939250505056",
    info: {
      abiDefinition: [{...}, {...}],
      compilerOptions: "--bin --abi --userdoc --devdoc --add-std --optimize -o /tmp/solc030529307",
      compilerVersion: "0.2.2",
      developerDoc: {
        methods: {}
      },
      language: "Solidity",
      languageVersion: "0.2.2",
      source: "contract random { /* Generates a random number from 0 to 100 based on the last block hash */ function randomGen(uint seed) constant returns (uint randomNumber) { return(uint(sha3(block.blockhash(block.number-1), seed ))%100); }  /* generates a number from 0 to 2^n based on the last n blocks */ function multiBlockRandomGen(uint seed, uint size) constant returns (uint randomNumber) { uint n = 0; for (uint i = 0; i < size; i++){ if (uint(sha3(block.blockhash(block.number-i-1), seed ))%2==0) n += 2**i; } return n; }}",
      userDoc: {
        methods: {}
      }
    }
  }
}

Mit dieser Methode kann ich den Quellcode in einem Terminal bearbeiten, CrLf entfernen und die resultierenden Informationen in ein anderes Terminal kopieren und in einem dritten Terminal einfügen und in geth ausführen.

Tut mir leid, das zu sagen, aber das ist komplizierter als meine aktuelle Problemumgehung.
Wenn zwischen /**/ ein Zeilenumbruch steht, scheint es, als würden Kommentare nicht entfernt. Wir müssen so etwas tun: stackoverflow.com/a/911583/2402577@BokkyPooBah