mirror of
https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line.git
synced 2025-06-07 16:06:26 +00:00
Update 12_2_Accessing_Bitcoind_with_C.md
This commit is contained in:
parent
4f8f91e64e
commit
a8ac096af4
@ -121,15 +121,19 @@ printf ("%s\n", json_dumps (jsonresult, JSON_INDENT(2)));
|
||||
Alternatively, you can drill down to an individual item like `blocks`:
|
||||
```
|
||||
json_t *jsonblocks = NULL;
|
||||
jsonresult = json_object_get(jsonresult,"blocks");
|
||||
jsonblocks = json_object_get(jsonresult,"blocks");
|
||||
|
||||
int blocks;
|
||||
blocks = json_integer_value(jsonresult);
|
||||
blocks = json_integer_value(jsonblocks);
|
||||
printf("Block Count: %d\n",blocks);
|
||||
```
|
||||
Appendix II has an example of this complete code, with the variable initiatialization all rearranged to the top, and with cleanup of the JSON objects.
|
||||
Appendix II has an example of this complete code.
|
||||
|
||||
[[SUMMARY]]
|
||||
## Summary: Accessing Bitcoind with C
|
||||
|
||||
By linking to the `bitcoinrpc` and `jansson` libraries, you can easily access `bitcoind` via RPC calls from a C library. To do so, you create an RPC connection, then make individual RPC calls. `jansson` then allows you to decode the JSON responses.
|
||||
|
||||
_What is the power of C?_ C allows you to take the next step beyond shell-scripting, permitting the creation of more comprehensive and robust programs. A more comprehensive example will appear in the next chapter.
|
||||
|
||||
## Appendix I: Testing a Bitcoind Connection
|
||||
|
||||
@ -169,8 +173,115 @@ Successfully connected to server!
|
||||
```
|
||||
## Appendix II: Getting Mining Info
|
||||
|
||||
[[APPENDIX 2: First Code]]
|
||||
[[clean up organizing of initialization of variables]]
|
||||
[[FREE up the JSON objects]]
|
||||
Here's the complete code for the `getmininginfo` command, with organized variable initiatialization, error checking, and variable cleanup.
|
||||
```
|
||||
file: getmininginfo.c
|
||||
|
||||
[[BREAK OUT TWO MORE CHAPTERS ON GETTING INFO + PUTTING TRANSACTION TOGETHER; OR 1?]]
|
||||
#include <jansson.h>
|
||||
#include <bitcoinrpc.h>
|
||||
|
||||
int main(void) {
|
||||
|
||||
bitcoinrpc_cl_t *rpc_client;
|
||||
bitcoinrpc_method_t *getmininginfo = NULL;
|
||||
bitcoinrpc_resp_t *btcresponse = NULL;
|
||||
bitcoinrpc_err_t btcerror;
|
||||
|
||||
json_t *jsonresponse = NULL;
|
||||
json_t *jsonresult = NULL;
|
||||
json_t *jsonblocks = NULL;
|
||||
int blocks;
|
||||
|
||||
bitcoinrpc_global_init();
|
||||
|
||||
rpc_client = bitcoinrpc_cl_init_params ("bitcoinrpc", "73bd45ba60ab8f9ff9846b6404769487", "127.0.0.1", 18332);
|
||||
|
||||
if (rpc_client) {
|
||||
getmininginfo = bitcoinrpc_method_init(BITCOINRPC_METHOD_GETMININGINFO);
|
||||
|
||||
if (!getmininginfo) {
|
||||
|
||||
printf("ERROR: Unable to initialize getmininginfo method!\n");
|
||||
exit(-1);
|
||||
|
||||
}
|
||||
|
||||
btcresponse = bitcoinrpc_resp_init();
|
||||
if (!btcresponse) {
|
||||
|
||||
printf("Error: Cannot initialize response object!\n");
|
||||
exit(-1);
|
||||
|
||||
}
|
||||
|
||||
bitcoinrpc_call(rpc_client, getmininginfo, btcresponse, &btcerror);
|
||||
|
||||
if (btcerror.code != BITCOINRPCE_OK) {
|
||||
|
||||
|
||||
printf("Error: getmininginfo error code %d [%s]\n", btcerror.code,btcerror.msg);
|
||||
exit(-1);
|
||||
|
||||
}
|
||||
|
||||
printf("Full Response: ");
|
||||
jsonresponse = bitcoinrpc_resp_get (btcresponse);
|
||||
printf ("%s\n", json_dumps (jsonresponse, JSON_INDENT(2)));
|
||||
|
||||
printf("\nJust the Result: ");
|
||||
jsonresult = json_object_get(jsonresponse,"result");
|
||||
printf ("%s\n", json_dumps (jsonresult, JSON_INDENT(2)));
|
||||
|
||||
jsonblocks = json_object_get(jsonresult,"blocks");
|
||||
blocks = json_integer_value(jsonblocks);
|
||||
printf("\nBlock Count: %d\n",blocks);
|
||||
|
||||
json_decref(jsonblocks);
|
||||
json_decref(jsonresult);
|
||||
json_decref(jsonresponse);
|
||||
|
||||
} else {
|
||||
|
||||
printf("ERROR: Failed to connect to server!\n");
|
||||
|
||||
}
|
||||
|
||||
bitcoinrpc_cl_free(rpc_client);
|
||||
bitcoinrpc_global_cleanup();
|
||||
|
||||
}
|
||||
```
|
||||
As usual, you can compile and run as follows:
|
||||
```
|
||||
$ cc getmininginfo.c -lbitcoinrpc -ljansson -o getmininginfo
|
||||
$ ./getmininginfo
|
||||
Full Response: {
|
||||
"id": "03406237-cd8f-466d-ac31-86711ea9d1db",
|
||||
"result": {
|
||||
"blocks": 1147154,
|
||||
"errors": "Warning: unknown new rules activated (versionbit 28)",
|
||||
"pooledtx": 0,
|
||||
"currentblocksize": 0,
|
||||
"currentblockweight": 0,
|
||||
"currentblocktx": 0,
|
||||
"difficulty": 313525.08513550513,
|
||||
"networkhashps": 3958339463617.417,
|
||||
"chain": "test"
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
|
||||
Just the Result: {
|
||||
"blocks": 1147154,
|
||||
"errors": "Warning: unknown new rules activated (versionbit 28)",
|
||||
"pooledtx": 0,
|
||||
"currentblocksize": 0,
|
||||
"currentblockweight": 0,
|
||||
"currentblocktx": 0,
|
||||
"difficulty": 313525.08513550513,
|
||||
"networkhashps": 3958339463617.417,
|
||||
"chain": "test"
|
||||
}
|
||||
|
||||
Block Count: 1147154
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user