Ethereum-Classic
Ethereum-PHP 如何從智能合約函式接收出站參數
在契約 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 呼叫它。