Как загрузить исходный файл Solidity в geth

Можно ли загрузить исходный файл Solidity .solв go-ethereum.

Я использую метод «loadScript», сохраняя .jsфайл, подобный следующему, и загружая его.

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

Есть ли лучший способ? я не хочу использоватьbrowser-solidity

Ответы (2)

Я нашел эту рубиновую оболочку Solidity Compile Helper

Применение

solc_helper contract.sol

Это создаст файл javascript и распечатает оператор, подобный следующему.

loadScript('/path/contract.js')

Вставьте этот оператор в консоль geth. Ваш код будет загружен, и ваш контракт будет развернут автоматически.

Есть также несколько вспомогательных функций для простого развертывания контрактов.

Обновление от 3 января 2017 г.

Обратите внимание, что компилятор Solidity 4.7 создает другой код для одного и того же контракта , если у вас разные пробелы. Это будет важно, когда вы попытаетесь добавить проверенные источники в обозреватели блокчейнов, поскольку скомпилированный источник должен соответствовать развернутому коду. Возможно, вы захотите рассмотреть возможность развертывания своих контрактов в блокчейне Mainnet или Testnet с помощью Browser Solidity или Ethereum Wallet/Mist вместо использования gethкомандной строки.

Из ссылки выше:

pragma solidity ^0.4.7; contract Test { }  

производит:

6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a7230582083d1e44aa5fc6707310b1b2f2f853c4fe7a55c7d9d7f5fd00699d97527c4fe4a0029

А также

pragma solidity ^0.4.7; contract Test {}  

производит:

6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a723058204687f46477038e9c93d271aa664f966bf84275743951a45d1f7b801daafe15ae0029

Это связано с:

Я считаю, что эти дополнительные 32 байта — это хеш Swarm файла метаданных, который генерирует Solidity. См. примечания к выпуску для 0.4.7 . Комментарии к коду объясняют, что происходит.

Я согласен с тем, что это неожиданное поведение для изменения пробелов, но обратите внимание, что оно предназначено для помощи в проверке исходного кода, а не для ее предотвращения (см. комментарии в коде при использовании для проверки исходного кода ).



Используя Linux (также будет работать в Cygwin), я создал простой сценарий Perl для удаления CRLF и сжатия пробелов, которые я сохраняю как $HOME/bin/stripCrLf :

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

Вам нужно будет запустить следующую команду, чтобы сделать команду исполняемой:

chmod 700 $HOME/bin/stripCrLf

Я сохранил следующий код, который я позаимствовал с https://gist.github.com/alexvandesande/259b4ffb581493ec0a1c , в random.sol.

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;
    }
}

Затем я могу запустить следующую команду в терминале Linux:

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; }}'

Затем я трижды щелкаю строку вывода и вставляю ее в командную строку geth:

> 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: {}
      }
    }
  }
}

Используя этот метод, я могу редактировать исходный код в одном терминале, stripCrLf и копировать полученную информацию в другом терминале, а также вставлять и запускать в geth в третьем терминале.

Извините, но это сложнее, чем мой текущий обходной путь.
Если между /**/ есть новая строка, кажется, что комментарии не удаляются. Мы должны сделать что-то подобное: stackoverflow.com/a/911583/2402577@BokkyPooBah