通過 web3.py 連接到 Etherscan Ropsten API 的問題
我正在開發一個在使用者之間傳輸令牌的簡單應用程序。ERC20 標準代幣中的代幣。
我對 web3 和乙太坊開發世界真的很陌生,我對很多事情感到困惑。如果有人能指出我的錯誤在哪裡,那就太好了。
令牌合約部署在 ropsten 測試網上,我想呼叫 balanceOf() 和 transfer() 函式。但是,以 .call().balanceOf() 形式呼叫 balanceOf() 函式會出現錯誤:
File "/home/blah/blah/transactions.py", line 26, in <module> CONTRACT.call().balanceOf("0x70d704ab702097427Bba427492c86493e8B7597b") File "/usr/local/lib/python3.5/dist-packages/web3/contract.py", line 772, in call_contract_function return_data = contract.web3.eth.call(call_transaction) File "/usr/local/lib/python3.5/dist-packages/web3/eth.py", line 266, in call formatted_transaction = formatters.input_transaction_formatter(self, transaction) File "/usr/local/lib/python3.5/dist-packages/eth_utils/string.py", line 71, in inner return fn(*text_args, **text_kwargs) File "/usr/local/lib/python3.5/dist-packages/eth_utils/string.py", line 85, in inner return force_obj_to_text(fn(*args, **kwargs)) File "/usr/local/lib/python3.5/dist-packages/web3/formatters.py", line 125, in input_transaction_formatter 'from': eth.coinbase, File "/usr/local/lib/python3.5/dist-packages/eth_utils/string.py", line 85, in inner return force_obj_to_text(fn(*args, **kwargs)) File "/usr/local/lib/python3.5/dist-packages/web3/eth.py", line 70, in coinbase return self.web3._requestManager.request_blocking("eth_coinbase", []) File "/usr/local/lib/python3.5/dist-packages/web3/providers/manager.py", line 30, in request_blocking response = json.loads(force_text(response_raw)) File "/usr/lib/python3.5/json/__init__.py", line 319, in loads return _default_decoder.decode(s) File "/usr/lib/python3.5/json/decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
我不確定這是否是關於 HTTPProvider 未連接到“ https://ropsten.etherscan.io ”的錯誤,或者我用於 HTTPProvider 的 url 對於 ropsten 測試網不正確,或者其他一些問題。我已經仔細檢查了合約地址以及合約 ABI。或者是否存在與帳戶相關的氣體/乙太幣不足的問題?
我嘗試在私有測試網上測試另一個類似的合約,並且相同的程式碼執行良好。
$$ This might be $$關於 HTTPProvider 未連接到“ https://ropsten.etherscan.io ”的錯誤
沒錯,您不能將etherscan.io API用作 JSON-RPC 伺服器。
相反,我建議在本地執行一個與 Ropsten 同步的乙太坊節點,類似於(我認為)你執行私有測試網的方式。
一種方法是:
parity --chain ropsten
然後,您可以連接:
from web3 import Web3, HTTPProvider web3 = Web3(HTTPProvider("http://localhost:8545")) assert web3.isConnected()
當然,您需要先創建一個帳戶,然後才能進行
balanceOf()
通話。要使該transfer()
功能正常工作,您還需要發送帳戶ropsten ether。API 比較
讓我們看看每個 API 是如何發送最新的區塊號的。
乙太掃描
要使用etherscan.io API獲取目前塊號,您將使用 GET 呼叫,指定
eth_blockNumber
為action
參數。eth_blockNumber
返回最近塊的編號
https://ropsten.etherscan.io/api?module=proxy&action=eth_blockNumber&apikey=YourApiKeyToken
像這樣:
curl "https://ropsten.etherscan.io/api?module=proxy&action=eth_blockNumber"
乙太坊 JSON-RPC 伺服器
相比之下,JSON-RPC 將 API 指定為 POST 呼叫,並以
eth_blockNumber
sent 作為method
參數,如下所示:// Request curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' // Result { "id":83, "jsonrpc": "2.0", "result": "0x4b7" // 1207 }