Как определить правильные параметры составления контракта? - PullRequest
0 голосов
/ 27 июня 2018

Я успешно развернул свой контракт в Kaleido, но у меня возникли проблемы с поиском правильной проверки. Вот исходный код развертывания контракта, и я проверил, что адрес, напечатанный последним оператором печати, появляется в моей цепочке блоков Kaleido:

from web3 import Web3
from web3.providers import HTTPProvider
from solc import compile_source

# Solidity source code
contract_source_code = '''
pragma solidity ^0.4.0;

contract Greeter {
    string public greeting;

    function Greeter() {
        greeting = 'Hello';
    }

    function setGreeting(string _greeting) public {
        greeting = _greeting;
    }

    function greet() constant returns (string) {
        return greeting;
    }
}
'''

compiled_sol = compile_source(contract_source_code) # Compiled source code
contract_interface = compiled_sol[':Greeter']

w3 = Web3(HTTPProvider("https://XXXXX:YYYYY@ZZZZZZZ.kaleido.io"))

contract_ = w3.eth.contract(
    abi=contract_interface['abi'],
    bytecode=contract_interface['bin'])

# note: when interacting with kaleido, gasPrice MUST be 0 (I think because of the consensus algorithm I chose)
# and it seems it doesn't matter what account this is sent from
construct_txn = contract_.constructor().buildTransaction({
    'from': w3.eth.accounts[0],
    'gas': 1728712,
    'gasPrice': 0})
txn = w3.eth.sendTransaction(construct_txn)

tx_receipt = w3.eth.getTransactionReceipt(txn)
contract_address = tx_receipt['contractAddress']
print(contract_address)

Когда я пытаюсь проверить свой контракт, меня просят предоставить исходный код, имя контракта, версию компилятора и использовалась ли оптимизация.

Я использую следующее для запрошенного исходного кода

pragma solidity ^0.4.0;

contract Greeter {
    string public greeting;

    function Greeter() {
        greeting = 'Hello';
    }

    function setGreeting(string _greeting) public {
        greeting = _greeting;
    }

    function greet() constant returns (string) {
        return greeting;
    }
}

Я использую Greeter в качестве названия контракта. solc --version возвращает Version: 0.4.24+commit.e67f0147.Darwin.appleclang, которые, как я обнаружил, были совершены 16 мая: https://github.com/ethereum/solidity/search?q=e67f0147&type=Commits.

Я испробовал все следующие комбинации для версии компилятора + включена оптимизация: {0.4.24, 0.4.24-nightly.2018.5.16} x {оптимизация включена, оптимизация отключена}, и ни одна из этих комбинаций не сработала. Я получаю следующую ошибку при попытке 0.4.24-nightly.2018.5.16, так как компилятор и оптимизация не включены .:

The compiled result does not match the input creation bytecode located at 0x4c94e89d5ec3125339906109f143673f40868df2.

 Compilation failed: ["Warning: This is a pre-release compiler version, please do not use it in production.\n",":6:5: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use \"constructor(...) { ... }\" instead.\n function Greeter() {\n ^ (Relevant source part starts here and spans across multiple lines).\n",":6:5: Warning: No visibility specified. Defaulting to \"public\". \n function Greeter() {\n ^ (Relevant source part starts here and spans across multiple lines).\n",":14:5: Warning: No visibility specified. Defaulting to \"public\". \n function greet() constant returns (string) {\n ^ (Relevant source part starts here and spans across multiple lines).\n"] .

1 Ответ

0 голосов
/ 28 июня 2018

Вам не нужны параметры компилятора для проверки контракта. Только в редких случаях вам нужно будет знать их. В настоящее время я использую компилятор 0.4.21 и смог проверить свой контракт только с помощью исходного кода Solidity.

Я мог бы предложить указать конкретный компилятор, который вы используете в прагме контракта, вместо ^ 0.4.0.

Я также использовал среду Geth PoA, когда пытался проверить, и мне пришлось внести несколько изменений в ваш код, чтобы заставить это работать. Используете ли вы среду Quorum? Какой протокол?

Вот мой код, взятый из примера Quickstart в README:

import json
import web3

from web3 import Web3, HTTPProvider
from solc import compile_source
from web3.contract import ConciseContract
from web3.middleware import geth_poa_middleware

# Solidity source code
contract_source_code = '''
pragma solidity ^0.4.21;

contract Greeter {
    string public greeting;

    function Greeter() public {
        greeting = 'Hello';
    }

    function setGreeting(string _greeting) public {
        greeting = _greeting;
    }

    function greet() public returns (string) {
        return greeting;
    }
}
'''

compiled_sol = compile_source(contract_source_code) # Compiled source code
contract_interface = compiled_sol['<stdin>:Greeter']

# web3.py instance
w3 = Web3(HTTPProvider("https://YYY:ZZZ@XXXXXX.us-east-2.kaleido.io"))
w3.middleware_stack.inject(geth_poa_middleware, layer=0)

# set pre-funded account as sender
w3.eth.defaultAccount = w3.eth.accounts[0]

# Instantiate and deploy contract
Greeter = w3.eth.contract(abi=contract_interface['abi'], bytecode=contract_interface['bin'])

# Submit the transaction that deploys the contract
tx_hash = Greeter.constructor().transact()

# Wait for the transaction to be mined, and get the transaction receipt
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
print(tx_receipt.contractAddress)
# Create the contract instance with the newly-deployed address
greeter = w3.eth.contract(
    address=tx_receipt.contractAddress,
    abi=contract_interface['abi'],
)

# Display the default greeting from the contract
print('Default contract greeting: {}'.format(
    greeter.functions.greet().call()
))

print('Setting the greeting to Nihao...')
tx_hash = greeter.functions.setGreeting('Nihao').transact()
# Wait for transaction to be mined...
w3.eth.waitForTransactionReceipt(tx_hash)


# Display the new greeting value
print('Updated contract greeting: {}'.format(
    greeter.functions.greet().call()
))

# When issuing a lot of reads, try this more concise reader:
reader = ConciseContract(greeter)
assert reader.greet() == "Nihao"

Если вам действительно нужно знать, как найти аргументы времени компиляции, они обычно предоставляются как kwargs для функций компиляции. Вот исходная строка, которая сделает магию: https://github.com/ethereum/py-solc/blob/c595d84d9f0ef5f5da0a5d79e7d5fcabecfe5f06/solc/main.py#L106

...