当前位置:   article > 正文

c++以太坊访问:eth api接口调用(一)_c语言调用以太坊

c语言调用以太坊

最近接触到以太坊智能合约,在私有链上部署合约后,通过代码去调用合约方法,没有在网上找到c++对以太坊的调用库,发现java有以太坊相关的模块库web3j

(web3j是一个轻量级、高度模块化、反应式、类型安全的Java和Android库,用于处理智能合约和与以太坊网络上的客户端(节点)集成)。

自己尝试进行对web3j进行类似的封装,初步对eth的 json rpc api接口进行访问;

Infura开发手册 :http://cw.hubwiz.com/card/c/infura-api/1/2/3/  

现阶段目前使用c++  lincurl库对其进行部分接口访问,代码如下:

  1. string Web3j::eth_getBalance(string fromAddr)
  2. {
  3. string retstr ="";
  4. //封装发送的数据
  5. Json::Value object;
  6. Json::Value arr;
  7. arr.append(fromAddr);
  8. arr.append("latest");
  9. object["jsonrpc"] = "2.0";
  10. object["method"] = "eth_getBalance";
  11. object["params"] = arr;
  12. object["id"] = 1;
  13. string strpost = object.toStyledString();
  14. CURLcode res;
  15. //初始化一个CURL的指针
  16. CURL *hnd = curl_easy_init();
  17. if (!hnd)
  18. return "curl init failed!";
  19. //自定义请求
  20. curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
  21. struct MemoryStruct chunk;
  22. chunk.memory = (char*)malloc(1);
  23. chunk.size = 0;
  24. //请求头设置
  25. struct curl_slist *header = NULL;
  26. header = curl_slist_append(header, "Content-Type: application/json");
  27. curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, header);
  28. //设置访问URl
  29. curl_easy_setopt(hnd, CURLOPT_URL, m_sUrl.c_str());
  30. //设置发送超时时间
  31. curl_easy_setopt(hnd, CURLOPT_CONNECTTIMEOUT, 30);
  32. curl_easy_setopt(hnd, CURLOPT_TIMEOUT, 60);
  33. curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, OnWriteData);
  34. curl_easy_setopt(hnd, CURLOPT_WRITEDATA, (void *)&chunk);
  35. //请求参数
  36. curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, strpost.c_str());
  37. curl_easy_setopt(hnd, CURLOPT_POST, 1);
  38. curl_easy_setopt(hnd, CURLOPT_READFUNCTION, NULL);
  39. //打印调试信息
  40. curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1);
  41. res = curl_easy_perform(hnd);
  42. long info = 0;
  43. curl_easy_getinfo(hnd, CURLINFO_RESPONSE_CODE, &info);
  44. if (res != CURLE_OK || info != 200)
  45. {
  46. cout << "curl failed to perform " << res << " " << info;
  47. }
  48. else
  49. {
  50. //json字符串转为json对象解析
  51. Json::CharReaderBuilder b;
  52. Json::CharReader* reader(b.newCharReader());
  53. Json::Value value;
  54. JSONCPP_STRING err;
  55. bool ok = reader->parse(chunk.memory, chunk.memory + chunk.size, &value, &err);
  56. if (ok && err.size() == 0)
  57. {
  58. retstr = value["result"].asString();
  59. }
  60. else
  61. cout << "eth_getBalance return value parse failed!" << endl;
  62. delete reader;
  63. }
  64. //释放
  65. curl_slist_free_all(header);
  66. curl_easy_cleanup(hnd);
  67. return retstr;
  68. }

初步实现对账户余额(eth_getBalance)接口的访问,来源分析根据下图:

其他接口类似的用法,主要通过libcurl库对http的访问,以及json库对数据的封装。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/419618
推荐阅读
相关标签
  

闽ICP备14008679号