Estoy tratando de implementar mi contrato en la cadena de bloques en mi red privada con clave privada local (sin billetera: usé web3.auto.w3.account.create()).
Sé cómo enviar una transacción normal con clave privada local. Pero implementar el contrato no es fácil para mí. estoy usando web3.py
>>> from web3.auto import w3
>>> account = w3.eth.account.create()
>>> account.address
'0x653E3CE959a236278cF110E7C63052cDf94DB03B'
>>> account.privateKey
HexBytes('0x2aa62ebc701c8f075dc3755a85ddc5309025494288c408bc8e66fd095c393f91')
Obtengo la dirección y la clave privada. entonces lo que quiero hacer es...
web3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8555"))
contract_src = open('Funding.sol').read()
contract_bin = compile_source(contract_src)
contract_interface = contract_bin['<stdin>:Funding']
transaction = {
'from': <public address which I got>,
'gas': 100000,
'gasPrice': 0,
'nonce': 0,
...
}
signed = w3.eth.account.signTransaction(transaction, <private key which I got>)
web3.eth.sendRawTransaction(signed.rawTransaction)
En la transacción, ¿qué información debo poner?
Mi contrato se ve a continuación:
contract Information {
String str;
function modify(String s) public {
str = s;
}
}
contract Bag {
mapping(uint256 => Bag) contents;
uint256 public i = 0;
function create() public {
contents[i++] = new Information();
}
}
Lo que está tratando de hacer es factible y debería funcionar. su contrato realmente no importa mucho más que los argumentos para finalizar la función que está llamando.
Lo que ingresa transaction
es el objeto de transacción, puede encontrarlo aquí: https://web3js.readthedocs.io/en/1.0/web3-eth.html?highlight=transaction#id62
El atributo de datos del objeto de transacción es la función codificada ABI con su argumento, puede obtenerlo a través de este ejemplo: https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#id31
myContract.methods.myMethod(123).encodeABI(); '0x58cf5f10000000000000000000000000000000000000000000000000000000000000007B