PHPによるJsonRPC
[追記]
1.の方は解決しました。sslのバージョンを明記する必要があったみたいです。
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
php上でJsonRPCを送るために以下、curl関数を利用する方法と、外部のライブラリを利用する方法を行いましたが、尽く失敗しています。何故こんなにも難しいのでしょうか。
以下2.の方は、ライブラリ自体に不具合があるように思えてなりません。
そのためcurl関数での方法を教えて頂きたいです。
コマンドで正常な動作を確認した後、phpのcurl関数を利用してJsonRPC送信を試みましたが、失敗しました。以下実際のコードです。
function call_curl( $url, $param ) { $ch = curl_init(); if( isset( $url ) ) curl_setopt( $ch, CURLOPT_URL, $url ); if( isset( $param ) ) { $content = json_encode( $param ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $content ); curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: x-www-form-urlencoded') ); //curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json') ); //curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type' => 'application/json' ) ); } curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); $result = curl_exec( $ch ); $info = curl_getinfo( $ch ); var_dump( $info ); echo nl2br("\n"); var_dump( $result ); curl_close( $ch ); } $url = "https://ropsten.infura.io/..."; $param[ 'jsonrpc' ] = '2.0'; $param[ 'method' ] = 'eth_blockNumber'; $param[ 'params' ] = ''; $param[ 'id' ] = '1'; call_curl( $url, $param );
その後、githubのライブラリを利用して通信を試みました。結果は以下の通りです。
executeの第二引数に連想配列を渡すとエラーになってしまいます。
連想配列じゃない場合、例えばパラメータ一つのみの場合は正常に動作し、期待通りの結果が返ります。$client = new Client( $url ); $client->getHttpClient()->withDebug(); $result = $client->execute('eth_getTransactionByHash', ['0x...'] ); var_dump( $result );// 成功 unset( $result ); echo nl2br("\n"); echo nl2br("\n"); echo nl2br("\n"); $result = $client->execute('eth_call', ['from' => $owner_address, 'to' => $contract_address, 'data' => $encoded_sig] ); var_dump( $result );// エラー unset( $result );
以下エラー内容です
1のエラー
bool(false) Error:SSL connect error
2のエラー
Fatal error: Uncaught JsonRPC\Exception\InvalidJsonFormatException: Malformed payload in /var/www/test_project/blockchain/JsonRpc/fguillot/json-rpc/src/JsonRPC/Validator/JsonFormatValidator.php:27 Stack trace: #0 /var/www/test_project/blockchain/JsonRpc/fguillot/json-rpc/src/JsonRPC/Response/ResponseParser.php(86): JsonRPC\Validator\JsonFormatValidator::validate(NULL) #1 /var/www/test_project/blockchain/JsonRpc/fguillot/json-rpc/src/JsonRPC/Client.php(196): JsonRPC\Response\ResponseParser->parse() #2 /var/www/test_project/blockchain/JsonRpc/fguillot/json-rpc/src/JsonRPC/Client.php(179): JsonRPC\Client->sendPayload('{"jsonrpc":"2.0...', Array) #3 /var/www/test_project/blockchain/JsonRpcTest.php(39): JsonRPC\Client->execute('eth_call', Array) #4 {main} thrown in /var/www/test_project/blockchain/JsonRpc/fguillot/json-rpc/src/JsonRPC/Validator/JsonFormatValidator.php on line 27
SSL Version => NSS/3.27.1