43075


php上でJsonRPCを送るために以下、curl関数を利用する方法と、外部のライブラリを利用する方法を行いましたが、尽く失敗しています。何故こんなにも難しいのでしょうか。

以下2.の方は、ライブラリ自体に不具合があるように思えてなりません。  
そのためcurl関数での方法を教えて頂きたいです。

  1. コマンドで正常な動作を確認した後、phpのcurl関数を利用してJsonRPC送信を試みましたが、失敗しました。以下実際のコードです。
[code]      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 );
    
[/code]

  2. その後、[github](https://github.com/fguillot/JsonRPC)のライブラリを利用して通信を試みました。結果は以下の通りです。  
executeの第二引数に連想配列を渡すとエラーになってしまいます。  
連想配列じゃない場合、例えばパラメータ一つのみの場合は正常に動作し、期待通りの結果が返ります。

[code]      $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 );
    
[/code]

以下エラー内容です  
1のエラー

[code]

    bool(false) Error:SSL connect error
    
[/code]

2のエラー

[code]

    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 `
    
[/code]

SSL Version => NSS/3.27.1


CC BY-SA 4.0
2018-04-06T03:54:18.727
42984
2022-09-20T02:44:30.553
2022-09-20T02:43:09.497
3060
22827
question
php json http https php-curl
PHPによるJsonRPC


1.の方は解決しました。sslのバージョンを明記する必要があったみたいです。

[code]

    curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
    
[/code]


CC BY-SA 4.0
2018-04-09T01:30:03.000
43075
2022-09-20T02:44:30.553
2022-09-20T02:44:30.553
3060
22827
42984
answer