最近接触到以太坊智能合约,在私有链上部署合约后,通过代码去调用合约方法,没有在网上找到c++对以太坊的调用库,发现java有以太坊相关的模块库web3j
(web3j是一个轻量级、高度模块化、反应式、类型安全的Java和Android库,用于处理智能合约和与以太坊网络上的客户端(节点)集成)。
自己尝试进行对web3j进行类似的封装,初步对eth的 json rpc api接口进行访问;
:
现阶段目前使用c++ lincurl库对其进行部分接口访问,代码如下:
string Web3j::eth_getBalance(string fromAddr)
{
string retstr ="";
//封装发送的数据
Json::Value object;
Json::Value arr;
arr.append(fromAddr);
arr.append("latest");
object["jsonrpc"] = "2.0";
object["method"] = "eth_getBalance";
object["params"] = arr;
object["id"] = 1;
string strpost = object.toStyledString();
CURLcode res;
//初始化一个CURL的指针
CURL *hnd = curl_easy_init();
if (!hnd)
return "curl init failed!";
//自定义请求
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
struct MemoryStruct chunk;
chunk.memory = (char*)malloc(1);
chunk.size = 0;
//请求头设置
struct curl_slist *header = NULL;
header = curl_slist_append(header, "Content-Type: application/json");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, header);
//设置访问URl
curl_easy_setopt(hnd, CURLOPT_URL, m_sUrl.c_str());
//设置发送超时时间
curl_easy_setopt(hnd, CURLOPT_CONNECTTIMEOUT, 30);
curl_easy_setopt(hnd, CURLOPT_TIMEOUT, 60);
curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, OnWriteData);
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, (void *)&chunk);
//请求参数
curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, strpost.c_str());
curl_easy_setopt(hnd, CURLOPT_POST, 1);
curl_easy_setopt(hnd, CURLOPT_READFUNCTION, NULL);
//打印调试信息
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1);
res = curl_easy_perform(hnd);
long info = 0;
curl_easy_getinfo(hnd, CURLINFO_RESPONSE_CODE, &info);
if (res != CURLE_OK || info != 200)
{
cout << "curl failed to perform " << res << " " << info;
}
else
{
//json字符串转为json对象解析
Json::CharReaderBuilder b;
Json::CharReader* reader(b.newCharReader());
Json::Value value;
JSONCPP_STRING err;
bool ok = reader->parse(chunk.memory, chunk.memory + chunk.size, &value, &err);
if (ok && err.size() == 0)
{
retstr = value["result"].asString();
}
else
cout << "eth_getBalance return value parse failed!" << endl;
delete reader;
}
//释放
curl_slist_free_all(header);
curl_easy_cleanup(hnd);
return retstr;
}
初步实现对账户余额(eth_getBalance)接口的访问,来源分析根据下图:
其他接口类似的用法,主要通过libcurl库对http的访问,以及json库对数据的封装。
因篇幅问题不能全部显示,请点此查看更多更全内容