Ropsten

通過 web3.py 連接到 Etherscan Ropsten API 的問題

  • September 11, 2017

我正在開發一個在使用者之間傳輸令牌的簡單應用程序。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_blockNumberaction參數。

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_blockNumbersent 作為method參數,如下所示:

// Request
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}'

// Result
{
 "id":83,
 "jsonrpc": "2.0",
 "result": "0x4b7" // 1207
}

引用自:https://ethereum.stackexchange.com/questions/26225