Плагины и их API
Плагины представляют собой универсальный инструмент расширения ноды и её возможностей. Часть из них лишь отдают данные, подготавливают индексы, отвечают на сложные запросы пользователей с фильтрацией данных, часть из них обрабатывают custom операции и могут предоставлять совершенно отдельный сервис.
В данном разделе описаны некоторые доступные плагины GOLOS, предоставляющие пользователям доступ через API. Вы можете сами изучить API того или иного плагина, если будете следовать следующей инструкции:
    Открыть основной заголовочный файл плагина (пример для database_api), изучить DEFINE_API_ARGS (название API метода, тип возвращаемого значения);
    Открыть основной файл плагина (пример для database_api), изучить DEFINE_API (проверка параметров запроса, CHECK_ARGS_COUNT, формирование возвращаемого значения определенного типа);
    Изучить plugin_initialize, который может обрабатывать boost::program_options::variables_map для более тонкой настройки плагина через конфигурационный файл ноды.

Протокол запросов

Все запросы должны быть сформированы в JSON и выполнены через RPC. Транспортный протокол зависит от настройки ноды, возможны варианты как JSON-RPC через стандартные HTTP запросы, так и через WebSocket.
Для этого в конфигурационном файле ноды должны быть подключены плагины: json_rpc, webserver. Чтобы принимать транзакции от пользователей также должен быть включен плагин network_broadcast_api. Настройки для портов:
1
# Количество потоков для клиентов rpc. Оптимальное значение *количество ядер минус 1*
2
webserver-thread-pool-size = 2
3
4
# IP:PORT для HTTP подключений
5
webserver-http-endpoint = 0.0.0.0:8090
6
7
# IP:PORT для WebSocket подключений
8
webserver-ws-endpoint = 0.0.0.0:8091
Copied!
Чтобы обрабатывать запросы с поддержкой SSL, необходимо пробросить используемые порты через проксирующий сервер (например, nginx или apache), тогда станут возможными запросы через https/wss.

Формирование API запроса

Правила формирования запросов к публичной ноде довольно простые:
1
{"id":REQUEST_ID,"jsonrpc":"2.0","method":"call","params":["PLUGIN_NAME","PLUGIN_API_METHOD",[ARGS]]}
Copied!
    REQUEST_ID — номер запроса, носит необязательный характер (можно все запросы нумеровать единицей), но при соединении через web sockets (ws) позволяет ассоциировать ответы по запросам с аналогичным id;
    PLUGIN_NAME — название плагина, к которому выполняется запрос (например: database_api, committee_api);
    PLUGIN_API_METHOD — название метода, обрабатывающего запрос (например: get_accounts из database_api);
    ARGS — массив упорядоченных параметров, передаваемый методу плагина.

network_broadcast_api

Плагин, отвечающий за прием и рассылку между узлами сети подписанных блоков и транзакций
    broadcast_block — передача подписанного блока (signed_block) другим узлам сети;
    broadcast_transaction — передача подписанной транзакции (signed_transaction) другим узлам сети;
    broadcast_transaction_synchronous — передача подписанной транзакции (signed_transaction) другим узлам сети (ждет вхождения в блок и возвращает хэш транзакции, номер блока и номер транзакции в блоке, или возвращает false в случае истечения срока действия транзакции);
    broadcast_transaction_with_callback — то же, что и broadcast_transaction_synchronous, кроме проверки транзакции на валидность перед передачей в пул транзакций и регистрации метода обратного вызова (callback).

database_api

    get_account_count — возвращает количество аккаунтов в сети;
    get_accounts — возвращает массив аккаунтов по запрошенным логинам (отличается от lookup_account_names дополнительной информацией);
Пример:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["database_api","get_accounts",[["xel"]]]}
Copied!
Ответ:
1
[
2
{
3
"id": 89772,
4
"name": "xel",
5
"owner": {
6
"weight_threshold": 1,
7
"account_auths": [],
8
"key_auths": [
9
[
10
"GLS53nbKGcMwXw8zWMNLBm5XXLTW9fqZeQT5J7dC3Qso7GwJ7F8Hb",
11
1
12
]
13
]
14
},
15
"active": {
16
"weight_threshold": 1,
17
"account_auths": [],
18
"key_auths": [
19
[
20
"GLS81ApmkpdaJfbCXe7ZkbaiMeVcaQFW361sqC9r414fxVq9jNH3i",
21
1
22
]
23
]
24
},
25
"posting": {
26
"weight_threshold": 1,
27
"account_auths": [],
28
"key_auths": [
29
[
30
"GLS7WLHYqZrf9RYW273X34Aee7mK9pet8t83xgQ8jxeeZXXG3cTvS",
31
1
32
]
33
]
34
},
35
"memo_key": "GLS8iWbEMQB3WaXHLrCVyDoJAuPQhaiCby3g3PNL4h2hdWq7kiACb",
36
"json_metadata": "{"profile":{}}",
37
"proxy": "",
38
"last_owner_update": "2019-05-10T14:10:30",
39
"last_account_update": "2019-05-10T14:10:30",
40
"created": "2017-12-06T01:22:18",
41
"mined": false,
42
"owner_challenged": false,
43
"active_challenged": false,
44
"last_owner_proved": "1970-01-01T00:00:00",
45
"last_active_proved": "1970-01-01T00:00:00",
46
"recovery_account": "lex",
47
"last_account_recovery": "1970-01-01T00:00:00",
48
"reset_account": "null",
49
"comment_count": 4,
50
"lifetime_vote_count": 0,
51
"post_count": 0,
52
"can_vote": true,
53
"voting_power": 9802,
54
"last_vote_time": "2020-01-05T12:10:48",
55
"balance": "23.549 GOLOS",
56
"savings_balance": "0.000 GOLOS",
57
"sbd_balance": "0.000 GBG",
58
"sbd_seconds": "32824410702",
59
"sbd_seconds_last_update": "2020-02-17T12:02:54",
60
"sbd_last_interest_payment": "2018-02-05T16:51:54",
61
"savings_sbd_balance": "0.000 GBG",
62
"savings_sbd_seconds": "0",
63
"savings_sbd_seconds_last_update": "2019-12-11T16:05:15",
64
"savings_sbd_last_interest_payment": "2019-12-11T16:05:15",
65
"savings_withdraw_requests": 0,
66
"vesting_shares": "341688.730149 GESTS",
67
"delegated_vesting_shares": "0.000000 GESTS",
68
"received_vesting_shares": "0.000000 GESTS",
69
"vesting_withdraw_rate": "0.000000 GESTS",
70
"next_vesting_withdrawal": "1969-12-31T23:59:59",
71
"withdrawn": "185064241674",
72
"to_withdraw": "185064241674",
73
"withdraw_routes": 0,
74
"benefaction_rewards": 0,
75
"curation_rewards": 0,
76
"delegation_rewards": 0,
77
"posting_rewards": 0,
78
"proxied_vsf_votes": [
79
0,
80
0,
81
0,
82
0
83
],
84
"witnesses_voted_for": 0,
85
"average_bandwidth": 2721294841,
86
"average_market_bandwidth": 1080000000,
87
"lifetime_bandwidth": "632909000000",
88
"lifetime_market_bandwidth": "6119410000000",
89
"last_bandwidth_update": "2020-02-18T10:58:18",
90
"last_market_bandwidth_update": "2020-02-07T02:04:09",
91
"last_comment": "2020-02-18T10:54:03",
92
"last_post": "1970-01-01T00:00:00",
93
"post_bandwidth": 0,
94
"witness_votes": [],
95
"reputation": 0,
96
"posts_capacity": 3,
97
"comments_capacity": 32112,
98
"voting_capacity": 12,
99
"referrer_account": "",
100
"referrer_interest_rate": 0,
101
"referral_end_date": "1970-01-01T00:00:00",
102
"referral_break_fee": "0.000 GOLOS",
103
"last_active_operation": "2020-02-17T12:02:54"
104
}
105
]
Copied!
    get_block — возвращает информацию о блоке по его номеру;
Пример:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["database_api","get_block",["34940353"]]}
Copied!
Ответ:
1
{
2
"previous": "021525c0c311e480cde023eea5c2ba26e0d06c82",
3
"timestamp": "2020-02-19T12:09:15",
4
"witness": "pzm",
5
"transaction_merkle_root": "0000000000000000000000000000000000000000",
6
"extensions": [],
7
"witness_signature": "1f17e84a65e103c9cc476d27a29dbba4e5100ab60c79015418a5eeab0cf867b1ee7b4407b408b6d2d28fed9f08820defadb7f4ba715f4c520bb49c3fa5e5e8412a",
8
"transactions": []
9
}
Copied!
    get_chain_properties — возвращает медианные значения голосуемых параметров сети;
Пример:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["database_api","get_chain_properties",[]]}
Copied!
Ответ:
1
{
2
"account_creation_fee": "1.000 GOLOS",
3
"maximum_block_size": 65536,
4
"sbd_interest_rate": 0,
5
"create_account_min_golos_fee": "0.030 GOLOS",
6
"create_account_min_delegation": "0.150 GOLOS",
7
"create_account_delegation_time": 2592000,
8
"min_delegation": "0.010 GOLOS",
9
"max_referral_interest_rate": 1000,
10
"max_referral_term_sec": 15552000,
11
"min_referral_break_fee": "0.001 GOLOS",
12
"max_referral_break_fee": "100.000 GOLOS",
13
"posts_window": 7200,
14
"posts_per_window": 2,
15
"comments_window": 32767,
16
"comments_per_window": 50,
17
"votes_window": 15,
18
"votes_per_window": 5,
19
"auction_window_size": 0,
20
"max_delegated_vesting_interest_rate": 8000,
21
"custom_ops_bandwidth_multiplier": 10,
22
"min_curation_percent": 7500,
23
"max_curation_percent": 7500,
24
"curation_reward_curve": "square_root",
25
"allow_distribute_auction_reward": true,
26
"allow_return_auction_reward_to_fund": true,
27
"worker_reward_percent": 1000,
28
"witness_reward_percent": 1500,
29
"vesting_reward_percent": 7500,
30
"worker_request_creation_fee": "100.000 GBG",
31
"worker_request_approve_min_percent": 1500,
32
"sbd_debt_convert_rate": 100,
33
"vote_regeneration_per_day": 10,
34
"witness_skipping_reset_time": 21600,
35
"witness_idleness_time": 2592000,
36
"account_idleness_time": 15552000
37
}
Copied!
    get_dynamic_global_properties — возвращает данные о динамических глобальных свойствах сети;
Пример:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["database_api","get_dynamic_global_properties",[]]}
Copied!
Ответ:
1
{
2
"id": 0,
3
"head_block_number": 34940424,
4
"head_block_id": "021526082557e35d8f65271a46ddfec351eeb2de",
5
"time": "2020-02-19T12:12:48",
6
"current_witness": "blockchained",
7
"total_pow": 1719078,
8
"num_pow_witnesses": 172,
9
"virtual_supply": "223046315.397 GOLOS",
10
"current_supply": "200741691.274 GOLOS",
11
"confidential_supply": "0.000 GOLOS",
12
"current_sbd_supply": "7129967.558 GBG",
13
"confidential_sbd_supply": "0.000 GBG",
14
"total_vesting_fund_steem": "80100561.317 GOLOS",
15
"total_vesting_shares": "251334390154.901765 GESTS",
16
"total_reward_fund_steem": "254.756 GOLOS",
17
"total_reward_shares2": "21159194891210756",
18
"sbd_interest_rate": 0,
19
"sbd_print_rate": 0,
20
"sbd_debt_percent": 4046,
21
"average_block_size": 318,
22
"maximum_block_size": 65536,
23
"current_aslot": 35108656,
24
"recent_slots_filled": "340282366920938463463374607431768211455",
25
"participation_count": 128,
26
"last_irreversible_block_num": 34940409,
27
"max_virtual_bandwidth": "5986734968066277376",
28
"current_reserve_ratio": 20000,
29
"custom_ops_bandwidth_multiplier": 10,
30
"is_forced_min_price": true,
31
"transit_block_num": 29585430,
32
"transit_witnesses": "76766b0000000000000000000000000078746172000000000000000000000000646d696c617368000000000000000000726f706f7800000000000000000000006c657800000000000000000000000000676f6c6f73636f72650000000000000076696b00000000000000000000000000737465657073686f740000000000000073746968692d696f0000000000000000676f6c6f73696f0000000000000000006c6164797a6172756c656d0000000000797564696e612d63617400000000000063726561746f720000000000000000006b756e6100000000000000000000000064656e69732d736b7269706e696b00007072696d7573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
33
"worker_requests": [
34
[
35
"91600047785731",
36
0
37
]
38
]
39
}
Copied!
    get_escrow — возвращает информацию о трехсторонней сделке по логину аккаунта и идентификатору сделки (id);
    get_expiring_vesting_delegations — возвращает список возвращаемой делегированной доли (по времени истечения возврата);
    get_hardfork_version — возвращает версию текущего хардфорка;
    get_next_scheduled_hardfork — возвращает следующий запланированный хардфорк;
    get_potential_signatures — возвращает потенциальные публичные ключи для подписи транзакции;
    get_recovery_request — возвращает данные по запросу на восстановление доступа к аккаунту;
    get_required_signatures — возвращает публичные ключи из предложенных, которые необходимы для подписи транзакции (нужно направить транзакцию без подписи и предоставить открытые ключи);
    get_transaction_hex — возвращает hex значение сырой транзакции;
    get_vesting_delegations — возвращает список делегированной доли аккаунта;
    get_withdraw_routes — возвращает массив путей понижения доли для аккаунта;
    lookup_account_names — возвращает массив аккаунтов по запрошенным логинам;
    lookup_accounts — возвращает массив логинов аккаунтов по нижней границе с указанием количества возвращаемых элементов (не более 1000);
    verify_account_authority — проверяет подпись транзакции отдельным аккаунтом с указанием публичного ключа;
    verify_authority — принимает подписанную транзакцию и возвращает TRUE, если транзакция подписана всеми необходимыми ключами;

account_by_key

    get_key_references — возвращает массив логинов аккаунтов, которые содержат указанный публичный ключ.
Пример запроса:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["account_by_key","get_key_references",[["GLS53nbKGcMwXw8zWMNLBm5XXLTW9fqZeQT5J7dC3Qso7GwJ7F8Hb"]]]}
Copied!
Ответ:
1
[
2
[
3
"xel"
4
]
5
]
Copied!

account_history

    get_account_history — возвращает историю операций (в том числе и виртуальных), связанных с определенным аккаунтом.
Пример запроса:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["account_history","get_account_history",["xel","-1","1"]]}
Copied!
Ответ:
1
[
2
[
3
84,
4
{
5
"trx_id": "de0c1837f59023dd183e1f6f0d338f60432af2ab",
6
"block": 34910086,
7
"trx_in_block": 1,
8
"op_in_trx": 1,
9
"virtual_op": 0,
10
"timestamp": "2020-02-18T10:54:03",
11
"op": [
12
"comment_options",
13
{
14
"author": "xel",
15
"permlink": "re-lex-re-on0tole-re-lex-re-on0tole-re-lex-voznagrazhdeniya-za-shering-po-socsetyam-i-otkaz-ot-flagov-20200218t105406785z",
16
"max_accepted_payout": "1000000.000 GBG",
17
"percent_steem_dollars": 10000,
18
"allow_votes": true,
19
"allow_curation_rewards": true,
20
"extensions": []
21
}
22
]
23
}
24
],
25
[
26
85,
27
{
28
"trx_id": "b35973bbf446a37d3d64492388231f7d5531f93b",
29
"block": 34910171,
30
"trx_in_block": 0,
31
"op_in_trx": 0,
32
"virtual_op": 0,
33
"timestamp": "2020-02-18T10:58:18",
34
"op": [
35
"delete_comment",
36
{
37
"author": "xel",
38
"permlink": "re-lex-re-on0tole-re-lex-re-on0tole-re-lex-voznagrazhdeniya-za-shering-po-socsetyam-i-otkaz-ot-flagov-20200218t105406785z"
39
}
40
]
41
}
42
]
43
]
Copied!

operation_history

    get_ops_in_block — возвращает массив операций по номеру блока (можно указать необходимость показывать только виртуальные операции);
Пример:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["operation_history","get_ops_in_block",["31913871","false"]]}
Copied!
Ответ:
1
[
2
{
3
"trx_id": "0000000000000000000000000000000000000000",
4
"block": 31913871,
5
"trx_in_block": 65535,
6
"op_in_trx": 0,
7
"virtual_op": 1,
8
"timestamp": "2019-11-05T23:23:18",
9
"op": [
10
"producer_reward",
11
{
12
"producer": "xanoxt",
13
"vesting_shares": "488.592569 GESTS"
14
}
15
]
16
}
17
]
Copied!
    get_transaction — возвращает данные транзакции по её хэшу (id);

witness_api

    get_active_witnesses — возвращает массив делегатов в текущем раунде (из 21 слота, при наличии такого количества делегатов);
Пример:
1
{"id":1,"method":"call","jsonrpc":"2.0","params":["witness_api","get_active_witnesses",[]]}
Copied!
Ответ:
1
[
2
"blockchained",
3
"litrbooh",
4
"lex",
5
"prizm.space",
6
"aleksw",
7
"pzm",
8
"anyx",
9
"miner-113",
10
"ladyzarulem",
11
"rise",
12
"xanoxt",
13
"on0tole",
14
"primus",
15
"lulz",
16
"actual",
17
"vvk",
18
"lindsay",
19
"erikkartmen",
20
"arcange",
21
"jackvote",
22
"solox"
23
]
Copied!
    get_witness_by_account — возвращает делегата в соответствием с его логином;
    get_witness_count — возвращает количество аккаунтов, заявивших о желании быть делегатом;
    get_witness_schedule — возвращает очередь делегатов дополненную расчитанными медианными значениями параметров сети и мажориторной версией хардфорка;
    get_witnesses — возвращает массив делегатов в соответствием с их id (можно запросить нескольких в массиве);
    get_witnesses_by_vote — возвращает массив делегатов, отсортированных по потенциалу полученных голосов (указывается левая граница списка и количество возвращаемых значений в массиве, но не более 100);
    lookup_witness_accounts — возвращает массив логинов аккаунтов, которые заявляли себя как делегаты (указывается левая граница списка и количество возвращаемых значений в массиве, но не более 1000).
Last modified 1yr ago