Можно ли загрузить исходный файл 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
Я нашел эту рубиновую оболочку Solidity Compile Helper
Применение
solc_helper contract.sol
Это создаст файл javascript и распечатает оператор, подобный следующему.
loadScript('/path/contract.js')
Вставьте этот оператор в консоль geth. Ваш код будет загружен, и ваш контракт будет развернут автоматически.
Есть также несколько вспомогательных функций для простого развертывания контрактов.
Обратите внимание, что компилятор 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 в третьем терминале.
никсмак
альпер