Ethereum-Classic

Ethereum-PHP 如何從智能合約函式接收出站參數

  • April 27, 2018

在契約 sol 文件中,我有函式定義:

function product(uint32 _prdId) public view 
returns (uint32 prdId, string prdName, address prd, uint closeTime, 
        uint promoTime,uint8 bonus, uint256 price, uint8 numberOfOptions, 
        uint256 totalSupply, uint8 status, uint32 next)

我使用以下方法呼叫它:

$result[] = $schemaContract->product(new EthQ($prdId, ['abi'=>'uint32']));

結果我收到了錯誤:

InvalidArgumentException: NOT IN RANGE:
33305383022926077062160769047565073723568839191253455377021159521291545790954752953639166213543... (967 digits) ...> (u)int256 in /home/.../public_html/test/ethereum-php-master/src/DataType/EthQ.php:153 Stack trace: 
#0 /home/.../public_html/test/ethereum-php-master/src/DataType/EthQ.php(100): Ethereum\DataType\EthQ->getAbiFromNumber(Object(Math_BigInteger)) 
#1 /home/.../public_html/test/ethereum-php-master/src/DataType/EthDataType.php(112): Ethereum\DataType\EthQ->validate('0x0000000000000...', Array) 
#2 /home/.../public_html/test/ethereum-php-master/src/DataType/EthD.php(138): Ethereum\DataType\EthDataType->setValue('0x0000000000000...', Array) 
#3 /home/.../public_html/test/ethereum-php-master/src/DataType/EthQ.php(45): Ethereum\DataType\EthD->__construct('0x0000000000000...', Array) 
#4 /home/.../public_html/test/ethereum-php-master/src/DataType/EthD.php(199): Ethereum\DataType\EthQ->__construct('0x0000000000000...', Array) 
#5 /home/.../public_html/test/ethereum-php-master/src/SmartContract.php(92): Ethereum\DataType\EthD->convertByAbi('uint32') 
#6 /home/.../public_html/test/ethereum-php-master/testcontract.php(63): Ethereum\SmartContract->__call('product', Array) 
#7 {main}Unable to connect.

我不知道如何接收出站參數。我想我也應該使用 abi (與發送參數相同)來解碼這串數字,但不知道如何以及它是否是好的路徑。

感謝您的任何想法,最好的問候,TB

您正在使用來自digitaldonkey的****Ethereum-PHP的庫尚不支持多個值作為回報(正如開發人員所說的https://github.com/digitaldonkey/ethereum-php/issues/22)。

所以我找到的解決方法是:

**第一個解決方案(骯髒的解決方案):**在你的智能合約中創建幾個 getter,每個欄位一個。如果您必須檢索大量數據,此解決方案可能會很慢。例如在你的情況下:

function getProductName(uint32 _prdId) public view returns (string prdName) { ... }

function getProductAddress(uint32 _prdId) public view returns (address prd) { ... }

...

**第二種解決方案:**使用Web3 (for python)使用 python 編寫腳本,將該腳本編譯為執行檔並使用exec從 PHP 呼叫它。

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