Contract-Invocation

獲得不改變任何狀態變數的智能合約方法的結果

  • September 24, 2018

我知道在乙太坊中,如果一種智能合約方法不改變狀態變數,我們可以在不進行任何交易的情況下看到它的結果。

現在我想知道如何以程式方式查看此方法的結果?

例如,通過瀏覽器網站的 api,我可以向它發送一些數據,它會向我顯示一些結果。

我正在使用 php。所以請不要給我 web3.js 或 python 等。

例如,我想在此地址中獲取網路上totalSupply呼叫的智能合約方法的DS2Token結果:ropsten``0x53778036dce23a22303142923316af257d7ee813

我想有人在某處為 PHP 編寫了 web3 實現,但不管怎樣,您都可以通過對節點的簡單 HTTP 呼叫或諸如 infura 之類的代理來做到這一點。

要從函式中讀取,您需要知道它的簽名和要傳遞的參數。因為totalSupply(),這只是函式名的 keccak256 散列的前 4 個字節作為字元串,即keccak256("totalSupply()"),即0x18160ddd。您可以將其設置data為交易的地址,並將您的合約地址設置為to欄位,然後向eth_call. 在 curl 中,這看起來像:

curl https://ropsten.infura.io/ \
   -X POST \
   -H "Content-Type: application/json" \
   -d '{"jsonrpc":"2.0","method":"eth_call","params": [
   {"from": "0x53778036dce23a22303142923316af257d7ee813",
    "to": "0x53778036dce23a22303142923316af257d7ee813",
    "gas": "0x76c0","gasPrice": "0x9184e72a000","value": "0x0",
    "data": "0x18160ddd"}, "latest"],"id":1}'

fromandgasPrice值可以是任何值,但需要gas足夠大以允許完成讀取操作。

你會得到一個類似的結果{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000052b7d2c7f6fac568ea0000"}

然後,只需將收到的十六進制數轉換為十進制數,您就可以獲得總供應量。

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