smartcontractkit / full-blockchain-solidity-course-py

Ultimate Solidity, Blockchain, and Smart Contract - Beginner to Expert Full Course | Python Edition
MIT License
10.67k stars 2.89k forks source link

Lesson 4 - No puedo desplegar la transaccion #1839

Closed carovidela closed 1 year ago

carovidela commented 1 year ago

me devuelve un error al desplegar el siguiente codigo

from solcx import compile_standard, install_solc
import json
from web3 import Web3

# leemos el contrato
with open("./SimpleStorage.sol", "r") as file:
    simple_storage_file = file.read()
# print(simple_storage_file)

# compilamos
install_solc("0.6.0")
compliled_sol = compile_standard(
    {
        "language": "Solidity",
        "sources": {"SimpleStorage.sol": {"content": simple_storage_file}},
        "settings": {
            "outputSelection": {
                "*": {
                    "*": ["abi", "metadata", "evm.bytecode", "evm.bytecode.sourceMap"]
                }
            }
        },
    },
    solc_version="0.6.0",
)
# print(compliled_sol)

# guardar codigo compilado en un archivo
with open("compliled_code.json", "w") as file:
    json.dump(compliled_sol, file)

# par< desplegar necesitamos
# ABI
# Bytecode
# se encuentra ya compilado en el archivo por lo cual solo debemos acceder.
bytecode = compliled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["evm"][
    "bytecode"
]["object"]

abi = json.loads(
    compliled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["metadata"]
)["output"]["abi"]
# print(bytecode)
# print(abi)

# conectarme con ganache
# usando en el http la url provista por el ganache en RPC server
w3 = Web3(Web3.HTTPProvider("http://172.29.208.1:7545"))
chain_id = 1337

# primera adress de ganache ganache
my_adress = "0xcd22D4C9Ca6fb215c0C5Aad4d9e1Ad6462AAd75F"
# python nos exige que pongamos 0x antes de la key que copiamos de ganache
private_key = "0xc4c602552d905046824875e9859fc6fd563cd9a82b0140ccae70f7d3564a8ec8"

# creamos instancia del contrato
SimpleStorage = w3.eth.contract(abi=abi, bytecode=bytecode)
print(SimpleStorage)

nonce = w3.eth.getTransactionCount(my_adress)

# 1 construir la transaccion
# 2 firmar la transaccion
# 3 enviar la transaccion
transaccion = SimpleStorage.constructor().build_transaction(
    {
        "gasPrice": w3.eth.gas_price,
        "chain_Id": chain_id,
        "from": my_adress,
        "nonce": nonce,
    }
)
singned_txn = w3.eth.account.sign_transaction(transaccion, private_key=private_key)
print(singned_txn)

y el error

caro@Dell-Laptop-Caro:~/demos/web_py_simpleStorage$ python3 deploy.py <class 'web3._utils.datatypes.Contract'> Traceback (most recent call last): File "deploy.py", line 66, in transaccion = SimpleStorage.constructor().build_transaction( File "/home/caro/.local/lib/python3.8/site-packages/eth_utils/decorators.py", line 18, in _wrapper return self.method(obj, *args, **kwargs) File "/home/caro/.local/lib/python3.8/site-packages/web3/contract.py", line 692, in build_transaction return fill_transaction_defaults(self.web3, built_transaction) File "cytoolz/functoolz.pyx", line 249, in cytoolz.functoolz.curry.call File "/home/caro/.local/lib/python3.8/site-packages/web3/_utils/transactions.py", line 114, in fill_transaction_defaults default_val = default_getter(web3, transaction) File "/home/caro/.local/lib/python3.8/site-packages/web3/_utils/transactions.py", line 60, in 'gas': lambda web3, tx: web3.eth.estimate_gas(tx), File "/home/caro/.local/lib/python3.8/site-packages/web3/eth.py", line 868, in estimate_gas return self._estimate_gas(transaction, block_identifier) File "/home/caro/.local/lib/python3.8/site-packages/web3/module.py", line 57, in caller result = w3.manager.request_blocking(method_str, File "/home/caro/.local/lib/python3.8/site-packages/web3/manager.py", line 197, in request_blocking response = self._make_request(method, params) File "/home/caro/.local/lib/python3.8/site-packages/web3/manager.py", line 150, in _make_request return request_func(method, params) File "/home/caro/.local/lib/python3.8/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.8/site-packages/web3/middleware/gas_price_strategy.py", line 90, in middleware return make_request(method, params) File "/home/caro/.local/lib/python3.8/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.8/site-packages/web3/middleware/attrdict.py", line 33, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.8/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.8/site-packages/web3/middleware/formatting.py", line 87, in middleware web3_formatters_builder(w3, method), File "/home/caro/.local/lib/python3.8/site-packages/web3/middleware/validation.py", line 140, in build_method_validators w3_chain_id = w3.eth.chain_id File "/home/caro/.local/lib/python3.8/site-packages/web3/eth.py", line 632, in chain_id return self._chain_id() File "/home/caro/.local/lib/python3.8/site-packages/web3/module.py", line 57, in caller result = w3.manager.request_blocking(method_str, File "/home/caro/.local/lib/python3.8/site-packages/web3/manager.py", line 198, in request_blocking return self.formatted_response(response, File "/home/caro/.local/lib/python3.8/site-packages/web3/manager.py", line 171, in formatted_response raise ValueError(response["error"]) ValueError: {'message': 'Method eth_chainId not supported.', 'code': -32000, 'data': {'stack': 'Error: Method eth_chainId not supported.\n at s.handleRequest (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\ganache-core\lib\subproviders\geth_api_double.js:66:1)\n at t (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\index.js:116:1)\n at c.handleRequest (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\ganache-core\lib\subproviders\gethdefaults.js:17:1)\n at t (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\index.js:116:1)\n at o.d.handleRequest (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\subproviders\filters.js:89:1)\n at o.handleRequest (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\subproviders\subscriptions.js:135:1)\n at t (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\index.js:116:1)\n at f.handleRequest (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\ganache-core\lib\subproviders\delayedblockfilter.js:27:1)\n at t (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\index.js:116:1)\n at c.handleRequest (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\ganache-core\lib\subproviders\requestfunnel.js:32:1)\n at t (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\index.js:116:1)\n at s._handleAsync (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\index.js:103:1)\n at Timeout._onTimeout (C:\Users\Carolina\AppData\Local\Programs\Ganache\resources\app.asar\node_modules\ganache-cli\build\webpack:\ganache\node_modules\web3-provider-engine\index.js:87:1)\n at ontimeout (timers.js:469:11)\n at tryOnTimeout (timers.js:304:5)\n at Timer.listOnTimeout (timers.js:264:5)', 'name': 'Error'}}

cromewar commented 1 year ago

Hola @carovidela Estas usando el chainId 1337, asegure que ese id corresponda a tu instancia de ganache, si estas desplegando esto en un live network tienes que user el código correcto para esa blockchain.

carovidela commented 1 year ago

Hola Gracias por responder si asi es

image

carovidela commented 1 year ago

con que versión de web3 trabajas porque estoy con python 3.8.10 web3 ultima version y me dice buscando que es un problema de ganache con la version de web3

carovidela commented 1 year ago

y entre tanto probar ahora me sale esto

Traceback (most recent call last): File "deploy.py", line 3, in from web3 import Web3 File "/home/caro/.local/lib/python3.8/site-packages/web3/init.py", line 6, in from eth_account import ( File "/home/caro/.local/lib/python3.8/site-packages/eth_account/init.py", line 1, in from eth_account.account import ( File "/home/caro/.local/lib/python3.8/site-packages/eth_account/account.py", line 11, in from eth_keyfile import ( File "/home/caro/.local/lib/python3.8/site-packages/eth_keyfile/init.py", line 7, in from eth_keyfile.keyfile import ( # noqa: F401 File "/home/caro/.local/lib/python3.8/site-packages/eth_keyfile/keyfile.py", line 10, in from eth_keys import keys File "/home/caro/.local/lib/python3.8/site-packages/eth_keys/init.py", line 15, in from .main import ( # noqa: F401 File "/home/caro/.local/lib/python3.8/site-packages/eth_keys/main.py", line 3, in from eth_utils import ( File "/home/caro/.local/lib/python3.8/site-packages/eth_utils/init.py", line 1, in raise DeprecationWarning( DeprecationWarning: This library has been renamed to eth-utils. The ethereum-utils package will no longer recieve updates. Please update your dependencies accordingly.

cromewar commented 1 year ago

Ok, el error the cytools es bastante común, hay varias formas arreglar estoÑ

  1. usar WSL y manejar tu entorno de desarrollo en Linux desde Windows.
  2. Instalar Visual Studio Community para windows y sus herramientas de desarrollo para python.
carovidela commented 1 year ago

Bueno pude solucionar esto Instale WSL y esta manejando en el entorno de win con linux

sin embargo tengo un error al conectarme con ganache estoy media mariada. pero te cuento que tengo todo instalado caro@Dell-Laptop-Caro:~/demos/web3_SimpleStorage$ node -v v16.13.0 caro@Dell-Laptop-Caro:~/demos/web3_SimpleStorage$ npm -v 8.1.0

y tengo este error ahora Traceback (most recent call last): File "/home/caro/.local/lib/python3.10/site-packages/urllib3/connection.py", line 174, in _new_conn conn = connection.create_connection( File "/home/caro/.local/lib/python3.10/site-packages/urllib3/util/connection.py", line 95, in create_connection raise err File "/home/caro/.local/lib/python3.10/site-packages/urllib3/util/connection.py", line 85, in create_connection sock.connect(sa) TimeoutError: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/home/caro/.local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 703, in urlopen httplib_response = self._make_request( File "/home/caro/.local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 398, in _make_request conn.request(method, url, **httplib_request_kw) File "/home/caro/.local/lib/python3.10/site-packages/urllib3/connection.py", line 239, in request super(HTTPConnection, self).request(method, url, body=body, headers=headers) File "/usr/lib/python3.10/http/client.py", line 1282, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/lib/python3.10/http/client.py", line 1328, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/usr/lib/python3.10/http/client.py", line 1277, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/lib/python3.10/http/client.py", line 1037, in _send_output self.send(msg) File "/usr/lib/python3.10/http/client.py", line 975, in send self.connect() File "/home/caro/.local/lib/python3.10/site-packages/urllib3/connection.py", line 205, in connect conn = self._new_conn() File "/home/caro/.local/lib/python3.10/site-packages/urllib3/connection.py", line 179, in _new_conn raise ConnectTimeoutError( urllib3.exceptions.ConnectTimeoutError: (<urllib3.connection.HTTPConnection object at 0x7f53f5af4550>, 'Connection to 172.30.176.1 timed out. (connect timeout=10)')

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/home/caro/.local/lib/python3.10/site-packages/requests/adapters.py", line 489, in send resp = conn.urlopen( File "/home/caro/.local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 787, in urlopen retries = retries.increment( File "/home/caro/.local/lib/python3.10/site-packages/urllib3/util/retry.py", line 592, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='172.30.176.1', port=7545): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7f53f5af4550>, 'Connection to 172.30.176.1 timed out. (connect timeout=10)'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/home/caro/demos/web3_SimpleStorage/deploy.py", line 63, in nonce = w3.eth.getTransactionCount(my_adress) File "/home/caro/.local/lib/python3.10/site-packages/web3/module.py", line 57, in caller result = w3.manager.request_blocking(method_str, File "/home/caro/.local/lib/python3.10/site-packages/web3/manager.py", line 197, in request_blocking response = self._make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/manager.py", line 150, in _make_request return request_func(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/gas_price_strategy.py", line 90, in middleware return make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/attrdict.py", line 33, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/formatting.py", line 94, in middleware response = make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/buffered_gas_estimate.py", line 40, in middleware return make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/middleware/exception_retry_request.py", line 105, in middleware return make_request(method, params) File "/home/caro/.local/lib/python3.10/site-packages/web3/providers/rpc.py", line 88, in make_request raw_response = make_post_request( File "/home/caro/.local/lib/python3.10/site-packages/web3/_utils/request.py", line 112, in make_post_request response = session.post(endpoint_uri, data=data, *args, kwargs) # type: ignore File "/home/caro/.local/lib/python3.10/site-packages/requests/sessions.py", line 635, in post return self.request("POST", url, data=data, json=json, kwargs) File "/home/caro/.local/lib/python3.10/site-packages/requests/sessions.py", line 587, in request resp = self.send(prep, send_kwargs) File "/home/caro/.local/lib/python3.10/site-packages/requests/sessions.py", line 701, in send r = adapter.send(request, kwargs) File "/home/caro/.local/lib/python3.10/site-packages/requests/adapters.py", line 553, in send raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='172.30.176.1', port=7545): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7f53f5af4550>, 'Connection to 172.30.176.1 timed out. (connect timeout=10)'))

carovidela commented 1 year ago

Este es el codigo

from solcx import compile_standard, install_solc import json from web3 import Web3

with open("./SimpleStorage.sol", "r") as file: simple_storage_file = file.read()

print(simple_storage_file)

compilamos

install_solc("0.6.0") compliled_sol = compile_standard( { "language": "Solidity", "sources": {"SimpleStorage.sol": {"content": simple_storage_file}}, "settings": { "outputSelection": { "": { "": ["abi", "metadata", "evm.bytecode", "evm.bytecode.sourceMap"] } } }, }, solc_version="0.6.0", )

print(compliled_sol)

guardar codigo compilado en un archivo

with open("compliled_code.json", "w") as file: json.dump(compliled_sol, file)

par< desplegar necesitamos

ABI

Bytecode

se encuentra ya compilado en el archivo por lo cual solo debemos acceder.

bytecode = compliled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["evm"][ "bytecode" ]["object"]

abi = json.loads( compliled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["metadata"] )["output"]["abi"]

print(bytecode)

print(abi)

conectarme con ganache

usando en el http la url provista por el ganache en RPC server

w3 = Web3(Web3.HTTPProvider("http://172.30.176.1:7545")) chain_id = 1337

print(chain_id)

primera adress de ganache ganache

my_adress = "0x81568D25A76227f79cB8903acCed81Ee21e953CA" private_key = "0xa44c3b0688fab330a5a327d77891a4d51721c7514495cc260970e0114163e933"

private_key = os.getenv("PRIVATE_KEY")

print(private_key)

creamos instancia del contrato

SimpleStorage = w3.eth.contract(abi=abi, bytecode=bytecode)

print(SimpleStorage)

nonce = w3.eth.getTransactionCount(my_adress)

1 construir la transaccion

2 firmar la transaccion

3 enviar la transaccion

transaccion = SimpleStorage.constructor().build_transaction( { "chainId": chain_id, "gasPrice": w3.eth.gas_price, "from": my_adress, "nonce": nonce, } ) singned_txn = w3.eth.account.sign_transaction(transaccion, private_key=private_key) print(singned_txn)

y esta a conexion con ganache

image

carovidela commented 1 year ago

Queria contarles que pude solucionar los errores de conexion de WSL2 y ganache.

Si probaba la aplicacion con los datos proporcionados con la ejecucion de ganache-cli en ubuntu, compilaba correctamente. Sin embargo al usar la gui de ganache para win no lograba conectarse a la RPC informada.

Lo solucion permitiendo el acceso de ganache en el firewall de win en todos sus puertos y conexiones. Espero sea util para alguien mas.

Saldos

cromewar commented 1 year ago

Me alegra que consiguieras solucionar el problema.