From 49188d404e867067fd0cc79ebe2b26ce3427489f Mon Sep 17 00:00:00 2001 From: Alex Ant Date: Fri, 20 Mar 2026 23:37:38 +0500 Subject: [PATCH] update --- coopos/chain.swagger.yaml | 31 +- coopos/config.example.ini | 492 +++++ coopos/producer.swagger.yaml | 2 +- coopos/schemas/DateTime.yaml | 2 +- coopos/schemas/NamePrivileged.yaml | 2 +- coopos/schemas/Symbol.yaml | 2 +- docs/documentation.md | 12 +- docs/documentation/blockchain/components.md | 2 +- .../blockchain/configuration/api-node.md | 53 + .../blockchain/configuration/index.md | 29 + .../blockchain/configuration/light-node.md | 52 + .../parameters.md} | 11 +- .../configuration/production-node.md | 54 + .../blockchain/configuration/seed-node.md | 43 + .../blockchain/configuration/state-node.md | 58 + .../00_build-unsupported-os.md | 58 + .../00_install/01_build-from-source/index.md | 20 + .../blockchain/coopos/00_install/index.md | 28 + .../01_nodeos/02_usage/00_nodeos-options.md | 35 + .../02_usage/01_nodeos-configuration.md | 52 + .../02_node-setups/00_producing-node.md | 96 + .../02_node-setups/01_non-producing-node.md | 39 + .../02_usage/02_node-setups/index.md | 12 + .../00_local-single-node-testnet.md | 119 ++ .../01_local-multi-node-testnet.md | 209 +++ .../03_development-environment/index.md | 30 + .../single-host-multi-node-testnet.png | Bin 0 -> 213042 bytes .../single-host-single-node-testnet.png | Bin 0 -> 182310 bytes .../coopos/01_nodeos/02_usage/index.md | 10 + .../chain_api_plugin/api-reference/index.md | 1 + .../03_plugins/chain_api_plugin/index.md | 38 + .../03_plugins/chain_plugin/index.md | 244 +++ .../db_size_api_plugin/api-reference/index.md | 1 + .../03_plugins/db_size_api_plugin/index.md | 40 + .../01_nodeos/03_plugins/http_plugin/index.md | 72 + .../coopos/01_nodeos/03_plugins/index.md | 24 + .../net_api_plugin/api-reference/index.md | 1 + .../03_plugins/net_api_plugin/index.md | 49 + .../01_nodeos/03_plugins/net_plugin/index.md | 107 ++ .../api-reference/index.md | 1 + .../03_plugins/producer_api_plugin/index.md | 42 + .../10_block-producing-explained.md | 85 + .../03_plugins/producer_plugin/index.md | 134 ++ .../resource_monitor_plugin/index.md | 52 + ...0_how-to-fast-start-without-old-history.md | 40 + ...w-to-replay-or-resync-with-full-history.md | 17 + ...ow-to-create-snapshot-with-full-history.md | 37 + ...w-to-restore-snapshot-with-full-history.md | 29 + .../03_plugins/state_history_plugin/index.md | 59 + .../api-reference/index.md | 1 + .../test_control_api_plugin/index.md | 46 + .../03_plugins/test_control_plugin/index.md | 37 + .../trace_api_plugin/api-reference/index.md | 1 + .../trace_api_plugin/clog-format.png | Bin 0 -> 30112 bytes .../03_plugins/trace_api_plugin/index.md | 197 ++ .../how-to-generate-a-blocks.log.md | 8 + .../04_replays/how-to-generate-a-snapshot.md | 17 + .../how-to-replay-from-a-blocks.log.md | 23 + .../how-to-replay-from-a-snapshot.md | 30 + .../coopos/01_nodeos/04_replays/index.md | 51 + .../coopos/01_nodeos/05_rpc_apis/index.md | 11 + .../06_logging/00_setup-logging.json.md | 16 + .../01_nodeos/06_logging/01_logging-levels.md | 87 + .../coopos/01_nodeos/06_logging/index.md | 110 ++ .../07_concepts/05_storage-and-read-modes.md | 60 + .../07_concepts/10_context-free-data/index.md | 16 + .../coopos/01_nodeos/07_concepts/index.md | 8 + .../01_nodeos/08_troubleshooting/index.md | 47 + .../blockchain/coopos/01_nodeos/index.md | 29 + .../02_how-to-guides/how-to-buy-ram.md | 23 + .../how-to-config-a-multisig-account.md | 20 + .../how-to-connect-a-specific-network.md | 23 + .../how-to-create-a-wallet.md | 58 + .../how-to-create-an-account.md | 53 + .../how-to-create-key-pairs.md | 70 + .../how-to-delegate-CPU-resource.md | 45 + .../how-to-delegate-net-resource.md | 45 + .../how-to-deploy-a-smart-contract.md | 22 + .../how-to-get-account-information.md | 56 + .../how-to-get-block-information.md | 81 + .../how-to-get-tables-information.md | 15 + .../how-to-get-transaction-information.md | 199 ++ .../02_how-to-guides/how-to-import-a-key.md | 50 + .../how-to-link-permission.md | 17 + .../how-to-list-all-key-pairs.md | 113 ++ .../02_how-to-guides/how-to-stake-resource.md | 25 + .../how-to-submit-a-transaction.md | 88 + .../how-to-transfer-an-eosio.token-token.md | 19 + .../02_how-to-guides/how-to-undelegate-CPU.md | 27 + .../02_how-to-guides/how-to-undelegate-NET.md | 27 + .../how-to-unlink-permission.md | 17 + .../02_how-to-guides/how-to-unstake-CPU.md | 27 + .../02_how-to-guides/how-to-unstake-NET.md | 27 + .../02_cleos/02_how-to-guides/how-to-vote.md | 28 + .../coopos/02_cleos/02_how-to-guides/index.md | 29 + .../03_command-reference/convert/index.md | 8 + .../convert/pack_action_data.md | 23 + .../convert/pack_transaction.md | 50 + .../convert/unpack_action_data.md | 28 + .../convert/unpack_transaction.md | 57 + .../03_command-reference/create/account.md | 72 + .../03_command-reference/create/index.md | 15 + .../03_command-reference/create/key.md | 28 + .../02_cleos/03_command-reference/get/abi.md | 18 + .../03_command-reference/get/account.md | 109 ++ .../03_command-reference/get/accounts.md | 21 + .../03_command-reference/get/actions.md | 32 + .../03_command-reference/get/block.md | 69 + .../02_cleos/03_command-reference/get/code.md | 38 + .../get/currency-balance.md | 23 + .../get/currency-stats.md | 24 + .../03_command-reference/get/currency.md | 8 + .../03_command-reference/get/index.md | 19 + .../02_cleos/03_command-reference/get/info.md | 29 + .../03_command-reference/get/schedule.md | 29 + .../03_command-reference/get/scope.md | 12 + .../03_command-reference/get/servants.md | 34 + .../03_command-reference/get/table.md | 47 + .../get/transaction-status.md | 38 + .../03_command-reference/get/transaction.md | 79 + .../get/transaction_id.md | 10 + .../02_cleos/03_command-reference/index.md | 19 + .../03_command-reference/multisig/index.md | 12 + .../multisig/multisig-approve.md | 23 + .../multisig/multisig-cancel.md | 18 + .../multisig/multisig-exec.md | 19 + .../multisig/multisig-invalidate.md | 19 + .../multisig/multisig-propose.md | 23 + .../multisig/multisig-propose_trx.md | 26 + .../multisig/multisig-review.md | 17 + .../multisig/multisig-unapprove.md | 20 + .../03_command-reference/net/connect.md | 58 + .../03_command-reference/net/disconnect.md | 56 + .../03_command-reference/net/index.md | 18 + .../03_command-reference/net/peers.md | 112 ++ .../03_command-reference/net/status.md | 68 + .../03_command-reference/push/index.md | 10 + .../03_command-reference/push/push-action.md | 47 + .../push/push-transaction.md | 52 + .../push/push-transactions.md | 8 + .../03_command-reference/set/index.md | 20 + .../03_command-reference/set/set-abi.md | 24 + .../03_command-reference/set/set-account.md | 91 + .../03_command-reference/set/set-action.md | 72 + .../03_command-reference/set/set-code.md | 42 + .../03_command-reference/set/set-contract.md | 81 + .../02_cleos/03_command-reference/sign.md | 16 + .../03_command-reference/system/index.md | 23 + .../system/system-bidname.md | 30 + .../system/system-bidnameinfo.md | 18 + .../system/system-buyram.md | 25 + .../system/system-canceldelay.md | 23 + .../system/system-claimrewards.md | 23 + .../system/system-delegatebw.md | 26 + .../system/system-listbw.md | 14 + .../system/system-listproducers.md | 12 + .../system/system-newaccount.md | 31 + .../system/system-regproducer.md | 25 + .../system/system-regproxy.md | 23 + .../system/system-rex-buyrex.md | 29 + .../system/system-rex-cancelrexorder.md | 28 + .../system/system-rex-closerex.md | 28 + .../system/system-rex-consolidate.md | 28 + .../system/system-rex-defundcpuloan.md | 29 + .../system/system-rex-defundnetloan.md | 31 + .../system/system-rex-deposit.md | 28 + .../system/system-rex-fundcpuloan.md | 29 + .../system/system-rex-fundnetloan.md | 30 + .../system/system-rex-lendrex.md | 29 + .../system/system-rex-mvfromsavings.md | 29 + .../system/system-rex-mvtosavings.md | 30 + .../system/system-rex-rentcpu.md | 31 + .../system/system-rex-rentnet.md | 31 + .../system/system-rex-rexexec.md | 29 + .../system/system-rex-sellrex.md | 27 + .../system/system-rex-unstaketorex.md | 31 + .../system/system-rex-updaterex.md | 28 + .../system/system-rex-withdraw.md | 29 + .../03_command-reference/system/system-rex.md | 25 + .../system/system-sellram.md | 24 + .../system/system-undelegatebw.md | 22 + .../system/system-unregprod.md | 19 + .../system/system-unregproxy.md | 19 + .../system/system-voteproducer-approve.md | 20 + .../system/system-voteproducer-prods.md | 20 + .../system/system-voteproducer-proxy.md | 20 + .../system/system-voteproducer-unapprove.md | 20 + .../system/system-voteproducer.md | 6 + .../02_cleos/03_command-reference/transfer.md | 81 + .../03_command-reference/version/client.md | 11 + .../03_command-reference/version/index.md | 23 + .../03_command-reference/wallet/create.md | 10 + .../03_command-reference/wallet/create_key.md | 23 + .../03_command-reference/wallet/import.md | 9 + .../03_command-reference/wallet/index.md | 15 + .../03_command-reference/wallet/keys.md | 25 + .../03_command-reference/wallet/list.md | 35 + .../03_command-reference/wallet/lock.md | 25 + .../03_command-reference/wallet/lock_all.md | 21 + .../03_command-reference/wallet/open.md | 25 + .../wallet/private_keys.md | 18 + .../03_command-reference/wallet/unlock.md | 21 + .../coopos/02_cleos/04_troubleshooting.md | 23 + .../blockchain/coopos/02_cleos/05_FAQ.md | 11 + .../blockchain/coopos/02_cleos/index.md | 125 ++ .../blockchain/coopos/03_keosd/10_usage.md | 107 ++ .../coopos/03_keosd/15_plugins/http_plugin.md | 3 + .../coopos/03_keosd/15_plugins/index.md | 14 + .../15_plugins/wallet_api_plugin/index.md | 45 + .../15_plugins/wallet_plugin/index.md | 45 + .../blockchain/coopos/03_keosd/20_security.md | 17 + .../03_keosd/35_wallet-specification.md | 144 ++ .../coopos/03_keosd/40_troubleshooting.md | 13 + .../blockchain/coopos/03_keosd/50_FAQ.md | 11 + .../blockchain/coopos/03_keosd/index.md | 21 + .../blockchain/coopos/10_utilities/index.md | 11 + .../coopos/10_utilities/trace_api_util.md | 48 + .../blockchain/coopos/doxygen.css | 1596 +++++++++++++++++ docs/documentation/blockchain/coopos/index.md | 19 + .../blockchain/coopos/leap_components.png | Bin 0 -> 49499 bytes .../blockchain/coopos/resources-powerup-ru.md | 33 + docs/documentation/blockchain/intro.md | 4 +- docs/documentation/blockchain/nodes.md | 21 +- docs/documentation/blockchain/sostav.md | 2 +- .../blockchain/state-history-ship.md | 77 + .../blockchain/system-resources.md | 26 + docs/documentation/blockchain/transactions.md | 2 +- docs/documentation/index.md | 2 +- docs/documentation/reactive-ship-reader.md | 45 + docs/metodology.md | 46 +- mkdocs.yml | 145 +- scripts/convert_wiki_admonitions.py | 78 + 232 files changed, 10551 insertions(+), 63 deletions(-) create mode 100644 coopos/config.example.ini create mode 100644 docs/documentation/blockchain/configuration/api-node.md create mode 100644 docs/documentation/blockchain/configuration/index.md create mode 100644 docs/documentation/blockchain/configuration/light-node.md rename docs/documentation/blockchain/{configuration.md => configuration/parameters.md} (97%) create mode 100644 docs/documentation/blockchain/configuration/production-node.md create mode 100644 docs/documentation/blockchain/configuration/seed-node.md create mode 100644 docs/documentation/blockchain/configuration/state-node.md create mode 100644 docs/documentation/blockchain/coopos/00_install/01_build-from-source/00_build-unsupported-os.md create mode 100644 docs/documentation/blockchain/coopos/00_install/01_build-from-source/index.md create mode 100644 docs/documentation/blockchain/coopos/00_install/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/00_nodeos-options.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/01_nodeos-configuration.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/00_producing-node.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/01_non-producing-node.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/00_local-single-node-testnet.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/01_local-multi-node-testnet.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/single-host-multi-node-testnet.png create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/single-host-single-node-testnet.png create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/02_usage/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/api-reference/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/api-reference/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/http_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/api-reference/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/api-reference/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/10_block-producing-explained.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/resource_monitor_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/10_how-to-fast-start-without-old-history.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/20_how-to-replay-or-resync-with-full-history.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/30_how-to-create-snapshot-with-full-history.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/40_how-to-restore-snapshot-with-full-history.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/api-reference/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/api-reference/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/clog-format.png create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-blocks.log.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-snapshot.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-blocks.log.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-snapshot.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/04_replays/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/05_rpc_apis/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/06_logging/00_setup-logging.json.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/06_logging/01_logging-levels.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/06_logging/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/07_concepts/05_storage-and-read-modes.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/07_concepts/10_context-free-data/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/07_concepts/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/08_troubleshooting/index.md create mode 100644 docs/documentation/blockchain/coopos/01_nodeos/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-buy-ram.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-config-a-multisig-account.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-connect-a-specific-network.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-a-wallet.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-an-account.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-key-pairs.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-CPU-resource.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-net-resource.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-deploy-a-smart-contract.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-account-information.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-block-information.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-tables-information.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-transaction-information.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-import-a-key.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-link-permission.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-list-all-key-pairs.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-stake-resource.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-submit-a-transaction.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-transfer-an-eosio.token-token.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-CPU.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-NET.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unlink-permission.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-CPU.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-NET.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-vote.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_action_data.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_transaction.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_action_data.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_transaction.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/account.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/key.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/abi.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/account.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/accounts.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/actions.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/block.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/code.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-balance.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-stats.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/info.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/schedule.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/scope.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/servants.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/table.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction-status.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction_id.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-approve.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-cancel.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-exec.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-invalidate.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose_trx.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-review.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-unapprove.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/connect.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/disconnect.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/peers.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/status.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-action.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transaction.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transactions.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-abi.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-account.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-action.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-code.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-contract.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/sign.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidname.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidnameinfo.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-buyram.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-canceldelay.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-claimrewards.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-delegatebw.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listbw.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listproducers.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-newaccount.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproducer.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproxy.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-buyrex.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-cancelrexorder.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-closerex.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-consolidate.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundcpuloan.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundnetloan.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-deposit.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundcpuloan.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundnetloan.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-lendrex.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvfromsavings.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvtosavings.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentcpu.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentnet.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rexexec.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-sellrex.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-unstaketorex.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-updaterex.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-withdraw.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-sellram.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-undelegatebw.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregprod.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregproxy.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-approve.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-prods.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-proxy.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-unapprove.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/transfer.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/client.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create_key.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/import.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/index.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/keys.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/list.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock_all.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/open.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/private_keys.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/unlock.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/04_troubleshooting.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/05_FAQ.md create mode 100644 docs/documentation/blockchain/coopos/02_cleos/index.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/10_usage.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/15_plugins/http_plugin.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/15_plugins/index.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_api_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_plugin/index.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/20_security.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/35_wallet-specification.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/40_troubleshooting.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/50_FAQ.md create mode 100644 docs/documentation/blockchain/coopos/03_keosd/index.md create mode 100644 docs/documentation/blockchain/coopos/10_utilities/index.md create mode 100644 docs/documentation/blockchain/coopos/10_utilities/trace_api_util.md create mode 100644 docs/documentation/blockchain/coopos/doxygen.css create mode 100644 docs/documentation/blockchain/coopos/index.md create mode 100644 docs/documentation/blockchain/coopos/leap_components.png create mode 100644 docs/documentation/blockchain/coopos/resources-powerup-ru.md create mode 100644 docs/documentation/blockchain/state-history-ship.md create mode 100644 docs/documentation/blockchain/system-resources.md create mode 100644 docs/documentation/reactive-ship-reader.md create mode 100644 scripts/convert_wiki_admonitions.py diff --git a/coopos/chain.swagger.yaml b/coopos/chain.swagger.yaml index 0b503b74f..1857ed9ee 100644 --- a/coopos/chain.swagger.yaml +++ b/coopos/chain.swagger.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: title: API цепи COOPOS - description: Спецификация Chain API узла COOPOS (nodeos, совместимый с EOSIO/Antelope). Подробности — в документации разработчика на https://coopenomics.world. + description: Спецификация Chain API узла COOPOS (nodeos). Подробности — в документации на https://coopenomics.world. version: 1.0.0 license: name: MIT @@ -25,6 +25,7 @@ components: paths: /get_account: post: + summary: Сведения об учётной записи description: Возвращает объект с подробностями об указанной учётной записи в блокчейне. operationId: get_account requestBody: @@ -47,6 +48,7 @@ paths: $ref: "schemas/Account.yaml" /get_block: post: + summary: Получить блок description: Возвращает объект с подробностями об указанном блоке блокчейна. operationId: get_block requestBody: @@ -69,6 +71,7 @@ paths: $ref: "schemas/Block.yaml" /get_block_info: post: + summary: Краткие сведения о блоке description: Аналогично `get_block`, но возвращает фиксированный урезанный набор данных блока меньшего размера. operationId: get_block_info requestBody: @@ -91,6 +94,7 @@ paths: $ref: "schemas/BlockInfo.yaml" /get_info: post: + summary: Общие сведения о цепи description: Возвращает объект с общими сведениями о блокчейне. operationId: get_info security: [] @@ -104,6 +108,7 @@ paths: /push_transaction: post: + summary: Применить транзакцию (push) description: Ожидает транзакцию в формате JSON и пытается применить её к блокчейну. operationId: push_transaction requestBody: @@ -136,6 +141,7 @@ paths: /send_transaction: post: + summary: Применить транзакцию (send) description: Ожидает транзакцию в формате JSON и пытается применить её к блокчейну. operationId: send_transaction requestBody: @@ -169,6 +175,7 @@ paths: /push_transactions: post: + summary: Применить несколько транзакций description: Ожидает одну или несколько транзакций в формате JSON и пытается применить их к блокчейну. operationId: push_transactions requestBody: @@ -188,6 +195,7 @@ paths: /get_block_header_state: post: + summary: Состояние заголовка блока description: Возвращает состояние заголовка блока. operationId: get_block_header_state requestBody: @@ -212,6 +220,7 @@ paths: /get_abi: post: + summary: ABI контракта description: Возвращает ABI контракта по имени учётной записи. operationId: get_abi requestBody: @@ -233,6 +242,7 @@ paths: $ref: "schemas/Abi.yaml" /get_currency_balance: post: + summary: Баланс токена description: Возвращает текущий баланс токена. operationId: get_currency_balance requestBody: @@ -264,6 +274,7 @@ paths: /get_currency_stats: post: + summary: Статистика токена description: Возвращает статистику по выпуску валюты (токена). operationId: get_currency_stats requestBody: @@ -287,6 +298,7 @@ paths: /get_required_keys: post: + summary: Ключи для подписи транзакции description: Возвращает ключи, необходимые для подписи транзакции. operationId: get_required_keys requestBody: @@ -315,6 +327,7 @@ paths: /get_producers: post: + summary: Список продюсеров description: Возвращает список продюсеров блокчейна. operationId: get_producers requestBody: @@ -360,6 +373,7 @@ paths: /get_raw_code_and_abi: post: + summary: Сырой WASM и ABI description: Возвращает сырой WASM и ABI контракта по имени учётной записи. operationId: get_raw_code_and_abi requestBody: @@ -392,6 +406,7 @@ paths: /get_scheduled_transactions: post: + summary: Запланированные транзакции description: Возвращает отложенные (запланированные) транзакции. operationId: get_scheduled_transactions requestBody: @@ -424,6 +439,7 @@ paths: /get_table_by_scope: post: + summary: Области таблиц (scopes) description: Возвращает области (scopes) таблиц контракта. operationId: get_table_by_scope requestBody: @@ -476,6 +492,7 @@ paths: /get_table_rows: post: + summary: Строки таблицы состояния description: Возвращает строки указанной таблицы состояния контракта. operationId: get_table_rows requestBody: @@ -539,6 +556,7 @@ paths: /get_code: post: + summary: Код контракта (WASM) description: Возвращает объект с WASM-кодом смарт-контракта. operationId: get_code requestBody: @@ -578,6 +596,7 @@ paths: /get_raw_abi: post: + summary: Сырой ABI контракта description: Возвращает объект с сырым ABI смарт-контракта. operationId: get_raw_abi requestBody: @@ -611,6 +630,7 @@ paths: /get_activated_protocol_features: post: + summary: Активированные возможности протокола description: Возвращает активированные на узле продюсера протокольные возможности. operationId: get_activated_protocol_features requestBody: @@ -655,6 +675,7 @@ paths: description: "Если активированных возможностей больше, чем limit, здесь порядковый номер следующей не вошедшей в ответ; иначе 0." /get_accounts_by_authorizers: post: + summary: Учётные записи по авторизующим description: По набору имён учётных записей и публичных ключей находит разрешения (authorities), которые полностью или частично могут быть удовлетворены этими данными. operationId: get_accounts_by_authorizers requestBody: @@ -715,6 +736,7 @@ paths: description: Порог — сумма весов, которую нужно достичь или превысить /get_transaction_status: post: + summary: Статус транзакции (финальность) description: Возвращает состояние цепи и при наличии — информацию о транзакции по её идентификатору. Требуется включённая функция статуса финальности транзакций в плагине chain (параметр nodeos `--transaction-finality-status-max-storage-size-gb`). operationId: get_transaction_status requestBody: @@ -738,6 +760,7 @@ paths: /send_transaction2: post: + summary: Применить транзакцию (send v2) description: | Пытается применить транзакцию в формате JSON к блокчейну. Поддерживает полную трассировку неудачной транзакции и повторные попытки через nodeos, если они включены на узле. При включённом повторе API-узел досылает транзакцию в P2P-сеть до истечения срока, включения в блок или необратимости. Внимание: по умолчанию вместо исключений возвращается полная трассировка ошибки. Не путайте наличие трассировки с успешным выполнением — проверяйте поля «receipt» и «except». @@ -784,6 +807,7 @@ paths: /compute_transaction: post: + summary: Симуляция транзакции без записи description: | Выполняет указанную транзакцию, формирует трассировку (включая расход ресурсов), затем откатывает все изменения состояния; субъективный биллинг для аккаунта не увеличивается. Подписи, если есть, обрабатываются, ошибки подписи игнорируются. Неуспешные транзакции всё равно содержат трассировку сбоя. Внимание: на публичных узлах с включённым compute_transaction нужно ограничивать частоту запросов (защита от DoS). @@ -818,6 +842,7 @@ paths: /get_code_hash: post: + summary: Хеш кода контракта description: Возвращает хеш кода смарт-контракта в блокчейне. Его можно сравнить с ожидаемым значением, чтобы убедиться, что код не менялся. operationId: get_code_hash requestBody: @@ -846,6 +871,7 @@ paths: /get_transaction_id: post: + summary: Идентификатор транзакции description: Возвращает идентификатор транзакции (хеш транзакции) для переданной транзакции. operationId: get_transaction_id requestBody: @@ -865,6 +891,7 @@ paths: /get_producer_schedule: post: + summary: Расписание продюсеров description: Возвращает текущее расписание продюсеров — активный список и порядок ротации. operationId: get_producer_schedule responses: @@ -887,6 +914,7 @@ paths: /send_read_only_transaction: post: + summary: Транзакция только для чтения description: Отправляет транзакцию только для чтения в формате JSON; она не предназначена для включения в блокчейн. Если транзакция меняет состояние цепи, узел отклонит её. operationId: send_read_only_transaction requestBody: @@ -917,6 +945,7 @@ paths: /push_block: post: + summary: Передать блок в цепь description: Передаёт блок в блокчейн (для специальных сценариев узла). operationId: push_block requestBody: diff --git a/coopos/config.example.ini b/coopos/config.example.ini new file mode 100644 index 000000000..481cc2c1f --- /dev/null +++ b/coopos/config.example.ini @@ -0,0 +1,492 @@ +# Percentage of cpu block production time used to produce block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin) +# cpu-effort-percent = 80 + +# Percentage of cpu block production time used to produce last block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin) +# last-block-cpu-effort-percent = 80 + + +# the location of the blocks directory (absolute path or relative to application data dir) (eosio::chain_plugin) +# blocks-dir = "blocks" + +# split the block log file when the head block number is the multiple of the stride +# When the stride is reached, the current block log and index will be renamed '/blocks--.log/index' +# and a new current block log and index will be created with the most recent block. All files following +# this format will be used to construct an extended block log. (eosio::chain_plugin) +# blocks-log-stride = + +# the maximum number of blocks files to retain so that the blocks in those files can be queried. +# When the number is reached, the oldest block file would be moved to archive dir or deleted if the archive dir is empty. +# The retained block log files should not be manipulated by users. (eosio::chain_plugin) +# max-retained-block-files = + +# the location of the blocks retained directory (absolute path or relative to blocks dir). +# If the value is empty, it is set to the value of blocks dir. (eosio::chain_plugin) +# blocks-retained-dir = + +# the location of the blocks archive directory (absolute path or relative to blocks dir). +# If the value is empty, blocks files beyond the retained limit will be deleted. +# All files in the archive directory are completely under user's control, i.e. they won't be accessed by nodeos anymore. (eosio::chain_plugin) +# blocks-archive-dir = + +# the location of the state directory (absolute path or relative to application data dir) (eosio::chain_plugin) +# state-dir = "state" + +# the location of the protocol_features directory (absolute path or relative to application config dir) (eosio::chain_plugin) +# protocol-features-dir = "protocol_features" + +# Pairs of [BLOCK_NUM,BLOCK_ID] that should be enforced as checkpoints. (eosio::chain_plugin) +# checkpoint = + +# Override default WASM runtime ( "eos-vm-jit", "eos-vm") +# "eos-vm-jit" : A WebAssembly runtime that compiles WebAssembly code to native x86 code prior to execution. +# "eos-vm" : A WebAssembly interpreter. +# (eosio::chain_plugin) +# wasm-runtime = eos-vm-jit + +# The name of an account whose code will be profiled (eosio::chain_plugin) +# profile-account = + +# Override default maximum ABI serialization time allowed in ms (eosio::chain_plugin) +# abi-serializer-max-time-ms = 15 + +# Maximum size (in MiB) of the chain state database (eosio::chain_plugin) +# chain-state-db-size-mb = 1024 + +# Safely shut down node when free space remaining in the chain state database drops below this size (in MiB). (eosio::chain_plugin) +# chain-state-db-guard-size-mb = 128 + +# Percentage of actual signature recovery cpu to bill. Whole number percentages, e.g. 50 for 50% (eosio::chain_plugin) +# signature-cpu-billable-pct = 50 + +# Number of worker threads in controller thread pool (eosio::chain_plugin) +# chain-threads = 2 + +# print contract's output to console (eosio::chain_plugin) +# contracts-console = false + +# print deeper information about chain operations (eosio::chain_plugin) + deep-mind = false + +# Account added to actor whitelist (may specify multiple times) (eosio::chain_plugin) +# actor-whitelist = + +# Account added to actor blacklist (may specify multiple times) (eosio::chain_plugin) +# actor-blacklist = + +# Contract account added to contract whitelist (may specify multiple times) (eosio::chain_plugin) +# contract-whitelist = + +# Contract account added to contract blacklist (may specify multiple times) (eosio::chain_plugin) +# contract-blacklist = + +# Action (in the form code::action) added to action blacklist (may specify multiple times) (eosio::chain_plugin) +# action-blacklist = + +# Public key added to blacklist of keys that should not be included in authorities (may specify multiple times) (eosio::chain_plugin) +# key-blacklist = + +# Deferred transactions sent by accounts in this list do not have any of the subjective whitelist/blacklist checks applied to them (may specify multiple times) (eosio::chain_plugin) +# sender-bypass-whiteblacklist = + +# Database read mode ("head", "irreversible", "speculative"). +# In "head" mode: database contains state changes up to the head block; transactions received by the node are relayed if valid. +# In "irreversible" mode: database contains state changes up to the last irreversible block; transactions received via the P2P network are not relayed and transactions cannot be pushed via the chain API. +# In "speculative" mode: database contains state changes by transactions in the blockchain up to the head block as well as some transactions not yet included in the blockchain; transactions received by the node are relayed if valid. +# (eosio::chain_plugin) +# read-mode = head + +# Allow API transactions to be evaluated and relayed if valid. (eosio::chain_plugin) + api-accept-transactions = true + +# Chain validation mode ("full" or "light"). +# In "full" mode all incoming blocks will be fully validated. +# In "light" mode all incoming blocks headers will be fully validated; transactions in those validated blocks will be trusted +# (eosio::chain_plugin) +# validation-mode = full + +# Disable the check which subjectively fails a transaction if a contract bills more RAM to another account within the context of a notification handler (i.e. when the receiver is not the code of the action). (eosio::chain_plugin) +# disable-ram-billing-notify-checks = false + +# Subjectively limit the maximum length of variable components in a variable legnth signature to this size in bytes (eosio::chain_plugin) +# maximum-variable-signature-length = 16384 + +# Indicate a producer whose blocks headers signed by it will be fully validated, but transactions in those validated blocks will be trusted. (eosio::chain_plugin) +# trusted-producer = + +# Database map mode ("mapped", "heap", or "locked"). +# In "mapped" mode database is memory mapped as a file. +# In "heap" mode database is preloaded in to swappable memory and will use huge pages if available. +# In "locked" mode database is preloaded, locked in to memory, and will use huge pages if available. +# (eosio::chain_plugin) +# database-map-mode = mapped + +# Maximum size (in MiB) of the EOS VM OC code cache (eosio::chain_plugin) +# eos-vm-oc-cache-size-mb = 1024 + +# Number of threads to use for EOS VM OC tier-up (eosio::chain_plugin) +# eos-vm-oc-compile-threads = 1 + +# Enable EOS VM OC tier-up runtime (eosio::chain_plugin) +# eos-vm-oc-enable = false + +# enable queries to find accounts by various metadata. (eosio::chain_plugin) +# enable-account-queries = false + +# maximum allowed size (in bytes) of an inline action for a nonprivileged account (eosio::chain_plugin) +# max-nonprivileged-inline-action-size = 4096 + +# Maximum size (in GiB) allowed to be allocated for the Transaction Retry feature. Setting above 0 enables this feature. (eosio::chain_plugin) +# transaction-retry-max-storage-size-gb = + +# How often, in seconds, to resend an incoming transaction to network if not seen in a block. +# Needs to be at least twice as large as p2p-dedup-cache-expire-time-sec. (eosio::chain_plugin) +# transaction-retry-interval-sec = 20 + +# Maximum allowed transaction expiration for retry transactions, will retry transactions up to this value. +# Should be larger than transaction-retry-interval-sec. (eosio::chain_plugin) +# transaction-retry-max-expiration-sec = 120 + +# Maximum size (in GiB) allowed to be allocated for the Transaction Finality Status feature. Setting above 0 enables this feature. (eosio::chain_plugin) +# transaction-finality-status-max-storage-size-gb = + +# Duration (in seconds) a successful transaction's Finality Status will remain available from being first identified. (eosio::chain_plugin) +# transaction-finality-status-success-duration-sec = 180 + +# Duration (in seconds) a failed transaction's Finality Status will remain available from being first identified. (eosio::chain_plugin) +# transaction-finality-status-failure-duration-sec = 180 + +# Log the state integrity hash on startup (eosio::chain_plugin) +# integrity-hash-on-start = false + +# Log the state integrity hash on shutdown (eosio::chain_plugin) +# integrity-hash-on-stop = false + +# If set to greater than 0, periodically prune the block log to store only configured number of most recent blocks. +# If set to 0, no blocks are be written to the block log; block log file is removed after startup. (eosio::chain_plugin) +# block-log-retain-blocks = + +# The filename (relative to data-dir) to create a unix socket for HTTP RPC; set blank to disable. (eosio::http_plugin) +# unix-socket-path = + +# The local IP and port to listen for incoming http connections; set blank to disable. (eosio::http_plugin) +# http-server-address = 127.0.0.1:8888 + +# Specify the Access-Control-Allow-Origin to be returned on each request (eosio::http_plugin) +# access-control-allow-origin = + +# Specify the Access-Control-Allow-Headers to be returned on each request (eosio::http_plugin) +# access-control-allow-headers = + +# Specify the Access-Control-Max-Age to be returned on each request. (eosio::http_plugin) +# access-control-max-age = + +# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin) +# access-control-allow-credentials = false + +# The maximum body size in bytes allowed for incoming RPC requests (eosio::http_plugin) +# max-body-size = 2097152 + +# Maximum size in megabytes http_plugin should use for processing http requests. -1 for unlimited. 429 error response when exceeded. (eosio::http_plugin) +# http-max-bytes-in-flight-mb = 500 + +# Maximum number of requests http_plugin should use for processing http requests. 429 error response when exceeded. (eosio::http_plugin) +# http-max-in-flight-requests = -1 + +# Maximum time for processing a request, -1 for unlimited (eosio::http_plugin) +# http-max-response-time-ms = 30 + +# Append the error log to HTTP responses (eosio::http_plugin) +# verbose-http-errors = false + +# If set to false, then any incoming "Host" header is considered valid (eosio::http_plugin) +# http-validate-host = true + +# Additionaly acceptable values for the "Host" header of incoming HTTP requests, can be specified multiple times. Includes http/s_server_address by default. (eosio::http_plugin) +# http-alias = + +# Number of worker threads in http thread pool (eosio::http_plugin) +# http-threads = 2 + +# If set to false, do not keep HTTP connections alive, even if client requests. (eosio::http_plugin) +# http-keep-alive = true + +# The actual host:port used to listen for incoming p2p connections. (eosio::net_plugin) +# p2p-listen-endpoint = 0.0.0.0:9876 + +# An externally accessible host:port for identifying this node. Defaults to p2p-listen-endpoint. (eosio::net_plugin) +# p2p-server-address = + +# The public endpoint of a peer node to connect to. Use multiple p2p-peer-address options as needed to compose a network. +# Syntax: host:port[:|] +# The optional 'trx' and 'blk' indicates to node that only transactions 'trx' or blocks 'blk' should be sent. Examples: +# p2p.eos.io:9876 +# p2p.trx.eos.io:9876:trx +# p2p.blk.eos.io:9876:blk +# (eosio::net_plugin) +# p2p-peer-address = + +# Maximum number of client nodes from any single IP address (eosio::net_plugin) +# p2p-max-nodes-per-host = 1 + +# Allow transactions received over p2p network to be evaluated and relayed if valid. (eosio::net_plugin) +# p2p-accept-transactions = true + +# The account and public p2p endpoint of a block producer node to automatically connect to when the it is in producer schedule proximity +# . Syntax: account,host:port +# Example, +# eosproducer1,p2p.eos.io:9876 +# eosproducer2,p2p.trx.eos.io:9876:trx +# eosproducer3,p2p.blk.eos.io:9876:blk +# (eosio::net_plugin) +# p2p-auto-bp-peer = + +# The name supplied to identify this node amongst the peers. (eosio::net_plugin) +# agent-name = EOS Test Agent + +# Can be 'any' or 'producers' or 'specified' or 'none'. If 'specified', peer-key must be specified at least once. If only 'producers', peer-key is not required. 'producers' and 'specified' may be combined. (eosio::net_plugin) +# allowed-connection = any + +# Optional public key of peer allowed to connect. May be used multiple times. (eosio::net_plugin) +# peer-key = + +# Tuple of [PublicKey, WIF private key] (may specify multiple times) (eosio::net_plugin) +# peer-private-key = + +# Maximum number of clients from which connections are accepted, use 0 for no limit (eosio::net_plugin) +# max-clients = 25 + +# number of seconds to wait before cleaning up dead connections (eosio::net_plugin) +# connection-cleanup-period = 30 + +# max connection cleanup time per cleanup call in milliseconds (eosio::net_plugin) +# max-cleanup-time-msec = 10 + +# Maximum time to track transaction for duplicate optimization (eosio::net_plugin) +# p2p-dedup-cache-expire-time-sec = 10 + +# Number of worker threads in net_plugin thread pool (eosio::net_plugin) +# net-threads = 4 + +# number of blocks to retrieve in a chunk from any individual peer during synchronization (eosio::net_plugin) +# sync-fetch-span = 100 + +# Enable experimental socket read watermark optimization (eosio::net_plugin) +# use-socket-read-watermark = false + +# The string used to format peers when logging messages about them. Variables are escaped with ${}. +# Available Variables: +# _name self-reported name +# +# _cid assigned connection id +# +# _id self-reported ID (64 hex characters) +# +# _sid first 8 characters of _peer.id +# +# _ip remote IP address of peer +# +# _port remote port number of peer +# +# _lip local IP address connected to peer +# +# _lport local port number connected to peer +# +# (eosio::net_plugin) +# peer-log-format = ["${_name}" - ${_cid} ${_ip}:${_port}] + +# peer heartbeat keepalive message interval in milliseconds (eosio::net_plugin) +# p2p-keepalive-interval-ms = 10000 + +# Enable block production, even if the chain is stale. (eosio::producer_plugin) +# enable-stale-production = false + +# Start this node in a state where production is paused (eosio::producer_plugin) +# pause-on-startup = false + +# Limits the maximum time (in milliseconds) that is allowed a pushed transaction's code to execute before being considered invalid (eosio::producer_plugin) +# max-transaction-time = 30 + +# Limits the maximum age (in seconds) of the DPOS Irreversible Block for a chain this node will produce blocks on (use negative value to indicate unlimited) (eosio::producer_plugin) +# max-irreversible-block-age = -1 + +# ID of producer controlled by this node (e.g. inita; may specify multiple times) (eosio::producer_plugin) +# producer-name = + +# Key=Value pairs in the form = +# Where: +# is a string form of a valid COOPOS public key +# +# is a string in the form : +# +# is KEY, KEOSD, or SE +# +# KEY: is a string form of a valid COOPOS private key which maps to the provided public key +# +# KEOSD: is the URL where keosd is available and the approptiate wallet(s) are unlocked +# +# (eosio::producer_plugin) +# signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 + +# account that can not access to extended CPU/NET virtual resources (eosio::producer_plugin) +# greylist-account = + +# Limit (between 1 and 1000) on the multiple that CPU/NET virtual resources can extend during low usage (only enforced subjectively; use 1000 to not enforce any limit) (eosio::producer_plugin) +# greylist-limit = 1000 + +# Offset of non last block producing time in microseconds. Valid range 0 .. -block_time_interval. (eosio::producer_plugin) +# produce-time-offset-us = 0 + +# Offset of last block producing time in microseconds. Valid range 0 .. -block_time_interval. (eosio::producer_plugin) +# last-block-time-offset-us = -200000 + +# Percentage of cpu block production time used to produce block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin) +# cpu-effort-percent = 10 + +# Percentage of cpu block production time used to produce last block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin) +# last-block-cpu-effort-percent = 10 + +# Threshold of CPU block production to consider block full; when within threshold of max-block-cpu-usage block can be produced immediately (eosio::producer_plugin) +# max-block-cpu-usage-threshold-us = 5000 + +# Threshold of NET block production to consider block full; when within threshold of max-block-net-usage block can be produced immediately (eosio::producer_plugin) +# max-block-net-usage-threshold-bytes = 1024 + +# Maximum wall-clock time, in milliseconds, spent retiring scheduled transactions (and incoming transactions according to incoming-defer-ratio) in any block before returning to normal transaction processing. (eosio::producer_plugin) +# max-scheduled-transaction-time-per-block-ms = 100 + +# Time in microseconds allowed for a transaction that starts with insufficient CPU quota to complete and cover its CPU usage. (eosio::producer_plugin) +# subjective-cpu-leeway-us = 31000 + +# Sets the maximum amount of failures that are allowed for a given account per window size. (eosio::producer_plugin) +# subjective-account-max-failures = 3 + +# Sets the window size in number of blocks for subjective-account-max-failures. (eosio::producer_plugin) +# subjective-account-max-failures-window-size = 1 + +# Sets the time to return full subjective cpu for accounts (eosio::producer_plugin) +# subjective-account-decay-time-minutes = 1440 + +# ratio between incoming transactions and deferred transactions when both are queued for execution (eosio::producer_plugin) +# incoming-defer-ratio = 1 + +# Maximum size (in MiB) of the incoming transaction queue. Exceeding this value will subjectively drop transaction with resource exhaustion. (eosio::producer_plugin) +# incoming-transaction-queue-size-mb = 1024 + +# Disable subjective CPU billing for API/P2P transactions (eosio::producer_plugin) +# disable-subjective-billing = true + +# Account which is excluded from subjective CPU billing (eosio::producer_plugin) +# disable-subjective-account-billing = + +# Disable subjective CPU billing for P2P transactions (eosio::producer_plugin) +# disable-subjective-p2p-billing = true + +# Disable subjective CPU billing for API transactions (eosio::producer_plugin) +# disable-subjective-api-billing = true + +# Number of worker threads in producer thread pool (eosio::producer_plugin) +# producer-threads = 1 + +# the location of the snapshots directory (absolute path or relative to application data dir) (eosio::producer_plugin) +# snapshots-dir = "snapshots" + +# Number of worker threads in read-only execution thread pool. Max 8. (eosio::producer_plugin) +# read-only-threads = + +# Time in microseconds the write window lasts. (eosio::producer_plugin) +# read-only-write-window-time-us = 200000 + +# Time in microseconds the read window lasts. (eosio::producer_plugin) +# read-only-read-window-time-us = 60000 + +# The local IP and port to listen for incoming prometheus metrics http request. (eosio::prometheus_plugin) +# prometheus-exporter-address = 127.0.0.1:9101 + +# Time in seconds between two consecutive checks of resource usage. Should be between 1 and 300 (eosio::resource_monitor_plugin) +# resource-monitor-interval-seconds = 2 + +# Threshold in terms of percentage of used space vs total space. If used space is above (threshold - 5%), a warning is generated. Unless resource-monitor-not-shutdown-on-threshold-exceeded is enabled, a graceful shutdown is initiated if used space is above the threshold. The value should be between 6 and 99 (eosio::resource_monitor_plugin) +# resource-monitor-space-threshold = 90 + +# Absolute threshold in gibibytes of remaining space; applied to each monitored directory. If remaining space is less than value for any monitored directories then threshold is considered exceeded.Overrides resource-monitor-space-threshold value. (eosio::resource_monitor_plugin) +# resource-monitor-space-absolute-gb = + +# Used to indicate nodeos will not shutdown when threshold is exceeded. (eosio::resource_monitor_plugin) +# resource-monitor-not-shutdown-on-threshold-exceeded = + +# Number of resource monitor intervals between two consecutive warnings when the threshold is hit. Should be between 1 and 450 (eosio::resource_monitor_plugin) +# resource-monitor-warning-interval = 30 + +# Limits the maximum time (in milliseconds) that is allowed for sending requests to a keosd provider for signing (eosio::signature_provider_plugin) +# keosd-provider-timeout = 5 + +# the location of the state-history directory (absolute path or relative to application data dir) (eosio::state_history_plugin) +# state-history-dir = "state-history" + +# the location of the state history retained directory (absolute path or relative to state-history dir). (eosio::state_history_plugin) +# state-history-retained-dir = + +# the location of the state history archive directory (absolute path or relative to state-history dir). +# If the value is empty string, blocks files beyond the retained limit will be deleted. +# All files in the archive directory are completely under user's control, i.e. they won't be accessed by nodeos anymore. (eosio::state_history_plugin) +# state-history-archive-dir = + +# split the state history log files when the block number is the multiple of the stride +# When the stride is reached, the current history log and index will be renamed '*-history--.log/index' +# and a new current history log and index will be created with the most recent blocks. All files following +# this format will be used to construct an extended history log. (eosio::state_history_plugin) +# state-history-stride = + +# the maximum number of history file groups to retain so that the blocks in those files can be queried. +# When the number is reached, the oldest history file would be moved to archive dir or deleted if the archive dir is empty. +# The retained history log files should not be manipulated by users. (eosio::state_history_plugin) +# max-retained-history-files = + +# enable trace history (eosio::state_history_plugin) +# trace-history = false + +# enable chain state history (eosio::state_history_plugin) +# chain-state-history = false + +# the endpoint upon which to listen for incoming connections. Caution: only expose this port to your internal network. (eosio::state_history_plugin) +# state-history-endpoint = 127.0.0.1:8080 + +# the path (relative to data-dir) to create a unix socket upon which to listen for incoming connections. (eosio::state_history_plugin) +# state-history-unix-socket-path = + +# enable debug mode for trace history (eosio::state_history_plugin) +# trace-history-debug-mode = false + +# if set, periodically prune the state history files to store only configured number of most recent blocks (eosio::state_history_plugin) +# state-history-log-retain-blocks = + +# the location of the trace directory (absolute path or relative to application data dir) (eosio::trace_api_plugin) +# trace-dir = "traces" + +# the number of blocks each "slice" of trace data will contain on the filesystem (eosio::trace_api_plugin) +# trace-slice-stride = 10000 + +# Number of blocks to ensure are kept past LIB for retrieval before "slice" files can be automatically removed. +# A value of -1 indicates that automatic removal of "slice" files will be turned off. (eosio::trace_api_plugin) +# trace-minimum-irreversible-history-blocks = -1 + +# Number of blocks to ensure are uncompressed past LIB. Compressed "slice" files are still accessible but may carry a performance loss on retrieval +# A value of -1 indicates that automatic compression of "slice" files will be turned off. (eosio::trace_api_plugin) +# trace-minimum-uncompressed-irreversible-history-blocks = -1 + +# ABIs used when decoding trace RPC responses. +# There must be at least one ABI specified OR the flag trace-no-abis must be used. +# ABIs are specified as "Key=Value" pairs in the form = +# Where can be: +# an absolute path to a file containing a valid JSON-encoded ABI +# a relative path from `data-dir` to a file containing a valid JSON-encoded ABI +# (eosio::trace_api_plugin) +# trace-rpc-abi = + +# Use to indicate that the RPC responses will not use ABIs. +# Failure to specify this option when there are no trace-rpc-abi configuations will result in an Error. +# This option is mutually exclusive with trace-rpc-api (eosio::trace_api_plugin) +# trace-no-abis = + +# Plugin(s) to enable, may be specified multiple times +# plugin = diff --git a/coopos/producer.swagger.yaml b/coopos/producer.swagger.yaml index 4e004d970..34effbef8 100644 --- a/coopos/producer.swagger.yaml +++ b/coopos/producer.swagger.yaml @@ -10,7 +10,7 @@ info: url: https://coopenomics.world tags: - name: Версия протокола 4.0 - description: Тег релиза бинарников Leap совпадает с версией протокола + description: Тег релиза бинарников COOPOS совпадает с версией протокола servers: - url: "{protocol}://{host}:{port}/v1" variables: diff --git a/coopos/schemas/DateTime.yaml b/coopos/schemas/DateTime.yaml index feb444eb7..9ed1c9b4e 100644 --- a/coopos/schemas/DateTime.yaml +++ b/coopos/schemas/DateTime.yaml @@ -1,3 +1,3 @@ type: string -description: Дата и время истечения транзакции (строка в формате, принимаемом узлом COOPOS/EOSIO). +description: Дата и время истечения транзакции (строка в формате, принимаемом узлом COOPOS). title: Дата и время diff --git a/coopos/schemas/NamePrivileged.yaml b/coopos/schemas/NamePrivileged.yaml index 56571bbe6..fb72f982a 100644 --- a/coopos/schemas/NamePrivileged.yaml +++ b/coopos/schemas/NamePrivileged.yaml @@ -1,4 +1,4 @@ type: string pattern: '^[a-z1-5\.]{1,13}$' -description: Имя привилегированной учётной записи (подмножество правил имён EOSIO/COOPOS). +description: Имя привилегированной учётной записи (подмножество правил имён COOPOS). title: Привилегированное имя diff --git a/coopos/schemas/Symbol.yaml b/coopos/schemas/Symbol.yaml index 93145cfe3..280017a42 100644 --- a/coopos/schemas/Symbol.yaml +++ b/coopos/schemas/Symbol.yaml @@ -1,4 +1,4 @@ type: string -description: Строка актива EOSIO/COOPOS — дробная часть с точностью 4 и символ из 1–7 заглавных букв через пробел, например «1.0000 ABC». +description: Строка актива COOPOS — дробная часть с точностью 4 и символ из 1–7 заглавных букв через пробел, например «1.0000 ABC». pattern: "^([0-9]{1,32}.[0-9]{4} [A-Z]{1,7})$" title: Символ актива diff --git a/docs/documentation.md b/docs/documentation.md index 00dc06532..d56ceb294 100644 --- a/docs/documentation.md +++ b/docs/documentation.md @@ -17,10 +17,10 @@ --- - Документация к блокчейн-протоколу EOSIO & ANTELOPE, который лежит в основе программного комплекса Цифрового Кошелька. + Документация по стеку **COOPOS** — узлам, API и инструментам блокчейна кооперативной экономики. - [:octicons-arrow-right-24: Подробнее](https://developers.eos.io) - [:octicons-arrow-right-24: Репозиторий](https://github.com/blockchain) + [:octicons-arrow-right-24: Блокчейн](documentation/blockchain/intro.md) + [:octicons-arrow-right-24: Программы узла](documentation/blockchain/coopos/index.md) - __Смарт-контракты__ @@ -189,7 +189,7 @@ docker run --name node -d -p 8888:8888 -p 8080:8080 \-v $HOME/blockchain/data:/m __Сборка из исходников__ -Инструкция сборки из исходного кода описана в [репозитории](https://github.com/coopenomics/blockchain). +Инструкция сборки из исходного кода описана в [репозитории COOPOS](https://github.com/coopenomics/coopos). @@ -260,11 +260,9 @@ const options = { const session = new Session(args, options) ``` -Теперь вы можете применять сформированную сессию для отправки транзакций в любые смарт-контракты системы. Для чтения же информации из таблиц блокчейна вам потребуется ApiClient: +Теперь вы можете применять сформированную сессию для отправки транзакций в любые смарт-контракты системы. Для чтения информации из таблиц блокчейна нужен клиент Chain API из [WharfKit](https://wharfkit.com) (класс `APIClient`, подключение по инструкции актуальной версии SDK): ``` -import { APIClient } from "@wharfkit/antelope" - const client = new APIClient({ url: "https://testnet.coopenomics.world", }) diff --git a/docs/documentation/blockchain/components.md b/docs/documentation/blockchain/components.md index f75a7c9f4..df7b4ec80 100644 --- a/docs/documentation/blockchain/components.md +++ b/docs/documentation/blockchain/components.md @@ -1,4 +1,4 @@ -Платформа кооперативной экономики основана на открытом исходном коде блокчейна EOSIO и Antelope. +Платформа кооперативной экономики использует стек **COOPOS**. ## nodeos Ведущая программа, которая управляет хранением данных в блокчейне, поддерживает сетевые соединения, передаёт и принимает транзакции, воспроизводит состояние базы данных, исполняет действия, и так далее - т.е. выполняет всю базовую инфраструктурную работу платформы. diff --git a/docs/documentation/blockchain/configuration/api-node.md b/docs/documentation/blockchain/configuration/api-node.md new file mode 100644 index 000000000..902f48f21 --- /dev/null +++ b/docs/documentation/blockchain/configuration/api-node.md @@ -0,0 +1,53 @@ +# Пример конфигурации: API-нода + +**API-нода** обслуживает приложения: запросы к состоянию цепочки (`chain_api_plugin`), при необходимости сеть (`net_api_plugin`), иногда трассировку и историю состояния. Она **не подписывает блоки**, но часто принимает транзакции от клиентов и передаёт их в сеть. + +## Зачем именно так + +- **`chain_api_plugin` + `http_plugin`** — основа публичного или внутреннего RPC. Количество **`http-threads`** и размер **`chain-state-db-size-mb`** увеличивают по фактической нагрузке (число одновременных запросов, тяжёлые таблицы). +- **`api-accept-transactions = true`** — если узел должен принимать `push_transaction` / аналоги; если API только для чтения, можно выставить `false` и разгрузить узел. +- **`read-mode`**: + - **`head`** — данные до последнего полученного блока; удобно для «свежих» ответов. + - **`irreversible`** — только до последнего необратимого блока; строже согласованность, но в режиме `irreversible` транзакции из P2P не ретранслируются и поведение API для пуша может отличаться (см. комментарии в `config.example.ini` к `read-mode`). +- **`validation-mode = full`** — стандарт для узла, который следует за сетью. +- **P2P** — достаточно пиров для синхронизации; не обязательно держать сотни соединений, как на seed. +- **`net_api_plugin`** — включайте осознанно: он раскрывает информацию о P2P и часто **не выставляют публично**. Для внутренней диагностики — за VPN/firewall. +- **Защита HTTP**: `http-validate-host`, лимиты `http-max-in-flight-requests`, `http-max-bytes-in-flight-mb`, `max-body-size`, reverse proxy с rate limit и TLS на границе. + +Опционально подключайте **`trace_api_plugin`** и **`state_history_plugin`**, если приложениям нужны трассировки действий или поток истории состояния (см. [State History (SHiP)](../state-history-ship.md)). **State-роль** (поставка истории по WebSocket) может жить **на этом же узле** или на отдельной [state-ноде](state-node.md) — совмещение с API удобно для малых контуров, разделение — для нагрузки и безопасности. + +## Фрагмент `config.ini` + +```ini +plugin = eosio::chain_plugin +plugin = eosio::net_plugin +plugin = eosio::http_plugin +plugin = eosio::chain_api_plugin +# Только защищённая внутренняя сеть: +# plugin = eosio::net_api_plugin + +http-server-address = 0.0.0.0:8888 +http-threads = 16 +http-validate-host = true +http-max-in-flight-requests = 500 +http-max-bytes-in-flight-mb = 256 +max-body-size = 1048576 + +chain-threads = 8 +chain-state-db-size-mb = 16384 +chain-state-db-guard-size-mb = 256 + +validation-mode = full +read-mode = head +api-accept-transactions = true + +p2p-listen-endpoint = 0.0.0.0:9876 +p2p-peer-address = seed1.example.com:9876 +p2p-peer-address = seed2.example.com:9876 +max-clients = 50 +net-threads = 4 + +# Нет producer-name / signature-provider +``` + +Для пользовательских доменов укажите **`access-control-allow-origin`** и связанные CORS-директивы только если это требуется браузерным клиентам; не используйте `*` на публичных эндпоинтах с чувствительными данными без понимания рисков. diff --git a/docs/documentation/blockchain/configuration/index.md b/docs/documentation/blockchain/configuration/index.md new file mode 100644 index 000000000..6c595f217 --- /dev/null +++ b/docs/documentation/blockchain/configuration/index.md @@ -0,0 +1,29 @@ +# Конфигурация + +Узел **COOPOS** настраивается как один процесс `nodeos`, набор **плагинов** и общий `config.ini`. От выбранных плагинов и значений ключевых директив зависит роль узла в сети. + +Ниже — практические профили развёртывания. Подробнее о ролях узлов в архитектуре сети см. [Ноды и синхронизация истории](../nodes.md). + +| Аспект | Seed-нода | Production-нода | API-нода | State-нода (история) | Light-нода | +|--------|------------|-----------------|----------|----------------------|------------| +| Назначение | Точка входа в P2P, «клей» топологии | Выпуск блоков (делегат/BP) | RPC для приложений | Поставка истории по **SHiP** | Быстрый старт **со снимка**, без полной истории | +| Плагины | `chain`, `net` | + `producer`, часто `http` | `chain`, `net`, `http`, `chain_api` (+ опц.) | + **`state_history`** | как правило `chain`, `net`, `http`, `chain_api` | +| Продюсирование | Нет | Да | Нет | Нет | Нет | +| HTTP API | Обычно выкл. или `127.0.0.1` | Локально / внутр. сеть | Публично или за proxy | Часто **совмещают** с API; можно только SHiP | Локальный/внутренний API кооператива | +| P2P | Много пиров | Узкий круг BP | Умеренно | Нужен для догона цепи | **Синхронизация между кооперативами** и с сетью | +| Особенности | — | Ключи продюсера | Нагрузка на RPC | Диск, защита WS SHiP | **`--snapshot`**, усечённый block log | + +**State-нода** может быть **на том же хосте, что и API-нода**, или вынесена отдельно — см. [State-нода](state-node.md). + +**Light-ноды** в системе кооперативов обычно сочетают **локальный API** и **P2P** между контурами; подробнее — [Light-нода](light-node.md). + +## Дальше по разделу + +- [Параметры](parameters.md) — справочник отдельных директив. +- [Seed-нода](seed-node.md) +- [Production-нода](production-node.md) +- [API-нода](api-node.md) +- [State-нода (история / SHiP)](state-node.md) +- [Light-нода](light-node.md) + +Во всех примерах подставьте реальные хосты пиров, порты и пути к каталогам данных (`--data-dir`). diff --git a/docs/documentation/blockchain/configuration/light-node.md b/docs/documentation/blockchain/configuration/light-node.md new file mode 100644 index 000000000..68cf73086 --- /dev/null +++ b/docs/documentation/blockchain/configuration/light-node.md @@ -0,0 +1,52 @@ +# Пример конфигурации: light-нода + +**Light-нода** — узел COOPOS, поднятый **со снимком состояния (snapshot)** вместо полной перекачки и replay цепи с генезиса. У неё **нет полной истории блоков** с начала сети: есть **актуальное состояние** на момент снимка и дальнейшее наращивание цепи через **P2P** с момента подключения. + +## Зачем именно так + +- **Старт за минуты/часы вместо многодневной синхронизации** — критично для кооперативных и периферийных установок, где не нужен архив всей сети. +- **`--snapshot path/to.snapshot`** при запуске `nodeos` задаёт файл снимка; каталог данных и конфиг согласуют с инструкцией к вашему релизу COOPOS. +- **Журнал блоков** может быть пустым или коротким: узел не обязан хранить полный `blocks.log` от блока 1, если политика допускает усечённый лог (`block-log-retain-blocks` и см. [Параметры](parameters.md)). +- **P2P** остаётся обязательным: light-ноды **синхронизируют новые блоки** с сетью так же, как полные ноды, только **без истории «до снимка»**. +- **API** (`chain_api_plugin`) на light-ноде типичен для **локальной работы** приложений кооператива: чтение таблиц, отправка транзакций в сеть — в пределах доступного состояния и головы цепи. + +## Кооперативы и light-ноды + +В системе кооперативной экономики развёртывание часто строится вокруг **light-нод**: у каждого контура есть **свой узел** со снимком, **локальный Chain API** для сервисов и **P2P** для обмена блоками **между узлами кооперативов** (и с публичными seed/BP по политике сети). Полные архивные ноды и выделенные **state-ноды** остаются на уровне инфраструктуры сети или провайдеров; для **глубокой истории** приложения подключают **[Реактивный чтец SHiP](../../reactive-ship-reader.md)** к узлу с SHiP, а не полагаются на полный лог на каждой light-ноде. + +## Фрагмент `config.ini` + +Профиль по смыслу близок к [API-ноде](api-node.md), но эксплуатация отличается **запуском со снимка** и часто **меньшими лимитами диска** под блоки. + +```ini +plugin = eosio::chain_plugin +plugin = eosio::net_plugin +plugin = eosio::http_plugin +plugin = eosio::chain_api_plugin + +validation-mode = full +read-mode = head + +http-server-address = 0.0.0.0:8888 +http-threads = 8 +api-accept-transactions = true + +p2p-listen-endpoint = 0.0.0.0:9876 +p2p-peer-address = peer-coop.example.com:9876 +p2p-peer-address = seed-public.example.com:9876 + +chain-state-db-size-mb = 8192 + +# Опционально: усечённый block log, если не нужна длинная локальная история блоков +# block-log-retain-blocks = 100000 + +# Опционально: SHiP на light-ноде — только для диапазона, доступного узлу после снимка +# plugin = eosio::state_history_plugin +# trace-history = true +# chain-state-history = true +# state-history-endpoint = 127.0.0.1:8080 +``` + +**Запуск (схематично):** `nodeos --config-dir ... --data-dir ... --snapshot /path/to/snapshot.bin` + +Конкретные флаги и порядок инициализации см. в документации к вашей версии COOPOS; снимок должен быть **совместим** по версии протокола с бинарником узла. diff --git a/docs/documentation/blockchain/configuration.md b/docs/documentation/blockchain/configuration/parameters.md similarity index 97% rename from docs/documentation/blockchain/configuration.md rename to docs/documentation/blockchain/configuration/parameters.md index fc25b10fc..2aa763d0a 100644 --- a/docs/documentation/blockchain/configuration.md +++ b/docs/documentation/blockchain/configuration/parameters.md @@ -1,5 +1,8 @@ -# Конфигурация -Каждый из описанных параметров можно настроить для оптимизации работы nodeos в зависимости от целей и условий эксплуатации. Настраивая эти параметры, можно существенно изменить поведение узла, его производительность, безопасность и отказоустойчивость. Все эти параметры, или некоторые из них, устанавливаются в файле config.ini или передаются в качестве аргументов при запуске nodeos. +# Параметры конфигурации + +Каждый из описанных параметров можно настроить для оптимизации работы `nodeos` (COOPOS) в зависимости от целей и условий эксплуатации. Настраивая эти параметры, можно существенно изменить поведение узла, его производительность, безопасность и отказоустойчивость. Значения задаются в `config.ini` или аргументами при запуске. + +Типовые сочетания параметров для **seed-**, **production-** и **API-** ноды приведены в разделе [Конфигурация](index.md). Полный закомментированный перечень опций с пояснениями на английском см. в репозитории: `coopos/config.example.ini`. ## cpu-effort-percent @@ -36,7 +39,7 @@ state-dir указывает путь к директории, где храни ## protocol-features-dir -Параметр protocol-features-dir указывает путь к директории, где хранятся файлы с признаками протоколов. Этот параметр используется для хранения и управления признаками протоколов EOSIO. +Параметр protocol-features-dir указывает путь к директории, где хранятся файлы с признаками протоколов. Этот параметр используется для хранения и управления признаками протоколов COOPOS. ## checkpoint @@ -312,7 +315,7 @@ producer-name задает идентификатор продюсера, кон ## signature-provider -Параметр signature-provider задает пары ключ-значение в формате =, где определяет тип и данные провайдера для подписи транзакций. Например, KEY: для приватного ключа EOSIO или KEOSD: для URL-адреса, где доступен keosd. +Параметр signature-provider задает пары ключ-значение в формате =, где определяет тип и данные провайдера для подписи транзакций. Например, KEY: для приватного ключа в формате KEY или KEOSD: для URL-адреса, где доступен keosd. ## greylist-account diff --git a/docs/documentation/blockchain/configuration/production-node.md b/docs/documentation/blockchain/configuration/production-node.md new file mode 100644 index 000000000..350ec9278 --- /dev/null +++ b/docs/documentation/blockchain/configuration/production-node.md @@ -0,0 +1,54 @@ +# Пример конфигурации: production-нода + +**Production-нода** (нода делегата / block producer) **подписывает блоки** от имени аккаунта из графика продюсеров. Это самый чувствительный с точки зрения безопасности профиль: компрометация `signature-provider` равна компрометации ключа продюсера. + +## Зачем именно так + +- **`producer_plugin` обязателен**; **`producer-name`** и **`signature-provider`** — минимальная пара для подписи блоков. На проде обычно используют `KEOSD:` или аппаратный провайдер, а не `KEY:` с приватным ключом в файле. +- **`pause-on-startup = true`** — после рестарта производство не начнётся, пока вы явно не возобновите его (защита от двойного выпуска при ошибках в инфраструктуре). Перед включением убедитесь, что цепочка синхронизирована и график корректен. +- **`enable-stale-production = false`** (по умолчанию) — не выпускать блоки, если цепочка считается устаревшей; снижает риск некорректного поведения при сетевых сбоях. +- **`api-accept-transactions = false`** — публичная «касса» транзакций не на BP; транзакции приходят по P2P от API- и других нод. +- **HTTP на `127.0.0.1`** — если `http_plugin` нужен только для локального `cleos`/мониторинга. Публичный RPC на продюсере обычно не нужен и увеличивает атакуемую поверхность. +- **P2P — узкий круг** — соединения с другими BP и доверенными relay; опции вроде `allowed-connection`, `peer-key` и `p2p-auto-bp-peer` помогают ограничить, кто может подключаться (см. комментарии в `coopos/config.example.ini`). +- **`validation-mode = full`** — полная проверка входящих блоков. +- **`read-mode = head`** — состояние до головы цепочки, что соответствует роли продюсера. + +Тюнинг **`cpu-effort-percent`**, **`producer-threads`**, **`chain-threads`** зависит от железа и нагрузки сети; начните с значений из примера и корректируйте по метрикам. + +## Фрагмент `config.ini` + +```ini +plugin = eosio::chain_plugin +plugin = eosio::net_plugin +plugin = eosio::http_plugin +plugin = eosio::producer_plugin + +producer-name = yourproducer +# Пример с keosd; в бою — безопасное хранилище ключей, не файл с KEY: +signature-provider = YOUR_BLOCK_SIGNING_PUBKEY=KEOSD:http://127.0.0.1:8900 + +pause-on-startup = true +enable-stale-production = false + +validation-mode = full +read-mode = head + +http-server-address = 127.0.0.1:8888 +http-validate-host = true +api-accept-transactions = false + +p2p-listen-endpoint = 0.0.0.0:9876 +p2p-server-address = YOUR_BP_PUBLIC:9876 +p2p-peer-address = peer-bp1.example.com:9876 +p2p-peer-address = peer-bp2.example.com:9876 + +chain-threads = 4 +producer-threads = 2 +cpu-effort-percent = 80 +last-block-cpu-effort-percent = 80 +max-transaction-time = 30 + +keosd-provider-timeout = 5 +``` + +Дополнительно настройте файрвол так, чтобы **P2P-порт** был доступен только нужным пирам, а не всему интернету, если политика сети это допускает. diff --git a/docs/documentation/blockchain/configuration/seed-node.md b/docs/documentation/blockchain/configuration/seed-node.md new file mode 100644 index 000000000..bcfe76058 --- /dev/null +++ b/docs/documentation/blockchain/configuration/seed-node.md @@ -0,0 +1,43 @@ +# Пример конфигурации: seed-нода + +**Seed-нода** — это узел, который в первую очередь держит **устойчивые P2P-соединения** и помогает новым участникам сети найти пиров. Она не выпускает блоки и обычно **не обязана** отдавать публичный HTTP API. Подробнее о роли seed в топологии см. [Ноды и синхронизация истории](../nodes.md). + +## Зачем именно так + +- **Только `chain_plugin` и `net_plugin`** — цепочка синхронизируется и ретранслируется по P2P без лишних подсистем (продюсер, публичный RPC). +- **`p2p-listen-endpoint` на `0.0.0.0`** — приём входящих соединений от других нод; **`p2p-server-address`** должен отражать **достижимый снаружи** адрес:порт, иначе пиры не смогут корректно анонсировать ваш узел. +- **Несколько `p2p-peer-address`** — связность с остальной сетью; для seed критично не зависеть от одного пира. +- **`max-clients` выше типового** — seed рассчитан на большее число одновременных P2P-клиентов, чем «одиночная» нода. +- **`validation-mode = full`** — полная проверка блоков; для публичной инфраструктуры это базовая гигиена. +- **`api-accept-transactions = false`** — снижает поверхность атаки: узел не принимает произвольные транзакции через Chain API (если HTTP вообще включён). +- **`http-server-address = 127.0.0.1:8888` или пусто** — мониторинг/админка только локально; наружу seed обычно открывают только P2P-порт. + +## Фрагмент `config.ini` + +```ini +# --- Плагины: цепочка + сеть, без продюсера и без публичного API +plugin = eosio::chain_plugin +plugin = eosio::net_plugin + +# --- P2P: слушаем на всех интерфейсах, анонсируем внешний адрес +p2p-listen-endpoint = 0.0.0.0:9876 +p2p-server-address = YOUR_PUBLIC_HOSTNAME:9876 + +p2p-peer-address = seed-a.example.com:9876 +p2p-peer-address = seed-b.example.com:9876 + +max-clients = 150 +net-threads = 8 +sync-fetch-span = 100 + +validation-mode = full +read-mode = head + +# --- HTTP только для локального мониторинга (при необходимости отключите строку, оставив пустым) +http-server-address = 127.0.0.1:8888 +api-accept-transactions = false + +# Нет producer-name и signature-provider — блоки не подписываются на этом узле +``` + +При необходимости добавьте `resource_monitor_plugin` и `prometheus_plugin` (см. [Параметры](parameters.md)) для дискового мониторинга и метрик — для долгоживущей seed это полезно. diff --git a/docs/documentation/blockchain/configuration/state-node.md b/docs/documentation/blockchain/configuration/state-node.md new file mode 100644 index 000000000..593457ce6 --- /dev/null +++ b/docs/documentation/blockchain/configuration/state-node.md @@ -0,0 +1,58 @@ +# Пример конфигурации: state-нода (история / SHiP) + +**State-нода** в прикладном смысле — это узел, на котором включён **`state_history_plugin`**, чтобы **отдавать историю цепи потоком** (блоки, трассировки, дельты таблиц) по протоколу **State History (SHiP)**. Такой узел обычно называют близко к **HISTORY-ноде** в [обзоре ролей узлов](../nodes.md). + +## Совмещение с API-нодой + +Один и тот же процесс `nodeos` может одновременно: + +- обслуживать **Chain API** (`chain_api_plugin` + `http_plugin`); +- вести **журналы SHiP** и слушать **WebSocket** на `state-history-endpoint`. + +Это удобно для небольших установок: один хост и для `get_table_rows`, и для индексатора по SHiP. **Обязательным** совмещение не является: для изоляции нагрузки и безопасности часто выделяют **отдельную машину** только под историю (большой диск, ограниченный круг клиентов по сети), а HTTP API держат на других узлах. + +## Зачем именно так + +- **`state_history_plugin`** — без него нет SHiP-канала, только обычный RPC и при необходимости Trace API с файлов. +- **`trace-history`** и **`chain-state-history`** включают по потребности: для обозревателей и индексаторов чаще нужны **и трассы, и дельты**; только дельты уменьшают объём, если не нужны детальные трассы. +- **`state-history-endpoint`** — слушать на **127.0.0.1** или внутреннем интерфейсе; наружу — только через VPN/SSH-туннель или reverse proxy с ограничением доступа. Поток истории не должен быть публичным без жёсткой политики. +- **`chain_plugin` + `net_plugin`** — узел должен **догонять сеть** и применять блоки, иначе журнал SHiP неполный. +- Размер диска и опции **stride / retain / archive** (`state-history-stride`, `max-retained-history-files`, `state-history-archive-dir` и др.) задают политику хранения; для долгоживущей ноды см. [Параметры](parameters.md). + +Индексаторы в экосистеме COOPOS могут использовать **[Реактивный чтец SHiP](../../reactive-ship-reader.md)** как готовый клиент к этому endpoint. + +## Фрагмент `config.ini` + +```ini +plugin = eosio::chain_plugin +plugin = eosio::net_plugin +plugin = eosio::http_plugin +plugin = eosio::chain_api_plugin +plugin = eosio::state_history_plugin + +# Синхронизация с сетью +p2p-listen-endpoint = 0.0.0.0:9876 +p2p-peer-address = seed1.example.com:9876 +p2p-peer-address = seed2.example.com:9876 + +validation-mode = full +read-mode = head + +# HTTP API — по желанию на этой же ноде; для только-SHIP можно оставить 127.0.0.1 +http-server-address = 127.0.0.1:8888 +api-accept-transactions = false + +# SHiP: только внутренняя сеть +trace-history = true +chain-state-history = true +state-history-endpoint = 127.0.0.1:8080 +# state-history-unix-socket-path = ship.sock + +state-history-dir = state-history +# state-history-stride = ... +# max-retained-history-files = ... + +# Нет producer-name / signature-provider +``` + +Подробнее по протоколу и эксплуатации: [State History (SHiP)](../state-history-ship.md). diff --git a/docs/documentation/blockchain/coopos/00_install/01_build-from-source/00_build-unsupported-os.md b/docs/documentation/blockchain/coopos/00_install/01_build-from-source/00_build-unsupported-os.md new file mode 100644 index 000000000..b8fb52cbe --- /dev/null +++ b/docs/documentation/blockchain/coopos/00_install/01_build-from-source/00_build-unsupported-os.md @@ -0,0 +1,58 @@ +--- +content_title: Сборка COOPOS из исходников на других Unix-системах +--- + +**Инструкции по сборке на неподдерживаемых ОС следует считать экспериментальными, предоставляются «как есть» (best effort) и могут быть неполными.** + +**Предупреждение о параллельной компиляции (флаг `-j`)**: при сборке C/C++ часто используют `make -j $(nproc)` по числу ядер. Учтите: некоторые единицы компиляции (.cpp) в COOPOS очень тяжёлые и при компиляции могут потреблять почти 4 ГБ ОЗУ. Возможно, придётся снизить степень параллелизма в зависимости от объёма памяти на машине сборки, например вместо `make -j $(nproc)` запустить `make -j2`. Исчерпание памяти обычно (но не всегда) проявляется как падение компилятора. + +В целом мы рекомендуем так называемую **pinned**-сборку: версии компилятора и Boost остаются одинаковыми между сборками разных версий COOPOS (COOPOS требует неизменности этих версий, иначе состояние нужно восстанавливать из переносимого снимка). + +
+ Инструкции по сборке на FreeBSD 13.1 + +Установите зависимости: +``` +pkg update && pkg install \ + git \ + cmake \ + curl \ + boost-all \ + python3 \ + llvm11 \ + pkgconf +``` +и выполните сборку (в FreeBSD 13.1 по умолчанию llvm13 — передайте cmake опции clang11): +``` +git submodule update --init --recursive +mkdir build +cd build +cmake -DCMAKE_CXX_COMPILER=clang++11 -DCMAKE_C_COMPILER=clang11 -DCMAKE_BUILD_TYPE=Release .. +make -j $(nproc) package +``` +
+ +### Запуск тестов + +При сборке из исходников рекомендуется запускать как минимум «параллелизуемые» тесты. В этот набор по умолчанию не входят WASM spec tests — их можно добавить для большего покрытия, они тоже запускаются параллельно. + +``` +cd build + +# «parallelizable tests»: минимальный набор, который стоит прогонять +ctest -j $(nproc) -LE _tests + +# Дополнительно: WASM spec tests +ctest -j $(nproc) -L wasm_spec_tests +``` + +Другие тесты доступны и полезны, но они чувствительны к другому ПО на той же машине и могут **SIGKILL** другие запущенные экземпляры **nodeos**: +``` +cd build + +# Эти тесты нельзя гонять параллельно, но они рекомендованы +ctest -L "nonparallelizable_tests" + +# Эти тесты нельзя гонять параллельно; выполняются долго +ctest -L "long_running_tests" +``` diff --git a/docs/documentation/blockchain/coopos/00_install/01_build-from-source/index.md b/docs/documentation/blockchain/coopos/00_install/01_build-from-source/index.md new file mode 100644 index 000000000..9f0b2e914 --- /dev/null +++ b/docs/documentation/blockchain/coopos/00_install/01_build-from-source/index.md @@ -0,0 +1,20 @@ +--- +content_title: Сборка COOPOS из исходников +--- + +Ранее рекомендованные shell-скрипты для сборки удалены; процесс полностью управляется CMake. Собирающим из исходников нужно самостоятельно установить зависимости. Список зависимостей и рекомендуемая процедура сборки — в файле [`README.md`](https://github.com/coopenomics/coopos/blob/main/README.md). Там же — как эффективно запускать тесты. + +### Использование DUNE +Вместо сборки из исходников можно использовать [DUNE](https://github.com/AntelopeIO/DUNE) — удобный старт в Docker на разных платформах. + +### Сборка из исходников +COOPOS можно собрать и установить из исходников. Актуальные инструкции — [здесь](https://github.com/coopenomics/coopos/blob/main/README.md#build-and-install-from-source). + +#### Сборка «pinned» (фиксированные версии компилятора и Boost) +Инструкции для pinned-сборки перенесены [сюда](https://github.com/coopenomics/coopos/blob/main/README.md#pinned-build). Перед сборкой полезно прочитать [предварительные требования](https://github.com/coopenomics/coopos/blob/main/README.md#prerequisites) и предупреждение о параллельной сборке с флагом `-j` [здесь](https://github.com/coopenomics/coopos/blob/main/README.md#step-3---build). + +#### Ручная (не «pinned») сборка +Инструкции для unpinned-сборки — [здесь](https://github.com/coopenomics/coopos/blob/main/README.md#unpinned-build). Также см. [prerequisites](https://github.com/coopenomics/coopos/blob/main/README.md#prerequisites) и предупреждение о `-j` [здесь](https://github.com/coopenomics/coopos/blob/main/README.md#step-3---build). + +### Запуск тестов +Описание доступных наборов тестов и способов запуска — [здесь](https://github.com/coopenomics/coopos/blob/main/README.md#test). diff --git a/docs/documentation/blockchain/coopos/00_install/index.md b/docs/documentation/blockchain/coopos/00_install/index.md new file mode 100644 index 000000000..bf327d830 --- /dev/null +++ b/docs/documentation/blockchain/coopos/00_install/index.md @@ -0,0 +1,28 @@ +--- +content_title: Установка ПО COOPOS +--- + +!!! note "Установка и сеть" + Рекомендуемый способ — **сборка COOPOS из исходников** (ниже). Конфигурация узлов в сети: [Конфигурация нод](../../configuration/index.md). + +Лучший способ установить и использовать COOPOS — собрать его из исходников: + +* [Сборка COOPOS из исходников](01_build-from-source/index.md) + +## Поддерживаемые операционные системы + +COOPOS в настоящее время поддерживает следующие ОС: + +1. Ubuntu 22.04 Jammy +2. Ubuntu 20.04 Focal + +!!! note "Примечание" + Сборка и установка COOPOS на других Unix-подобных системах теоретически возможны. На отдельной странице собрана полезная информация, но имейте в виду: это экспериментально и не поддерживается официально. + +* [Сборка COOPOS на других Unix-системах](01_build-from-source/00_build-unsupported-os.md) + +## Docker Utilities for Node Execution (D.U.N.E.) + +Если у вас другая ОС или вы не хотите собирать COOPOS из исходников, можно попробовать набор утилит на Docker — D.U.N.E. — для быстрого знакомства с COOPOS и разработки контрактов. + +* [DUNE (Docker Utilities for Node Execution)](https://github.com/AntelopeIO/DUNE) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/00_nodeos-options.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/00_nodeos-options.md new file mode 100644 index 000000000..0c8793ff3 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/00_nodeos-options.md @@ -0,0 +1,35 @@ +--- +content_title: Опции nodeos +--- + +`nodeos` — приложение командной строки (CLI). Его можно запускать вручную из терминала или скриптом. Поведение в основном задаётся загруженными плагинами и их опциями. У `nodeos` два класса опций: *специфичные для nodeos* и *специфичные для плагинов*. + +## Опции nodeos + +Они нужны в основном для «хозяйственных» задач: каталог данных блокчейна, имя файла конфигурации `nodeos`, путь к конфигурации логирования и т.д. Ниже — фрагмент вывода `nodeos --help` со специфичными для `nodeos` опциями (опции плагинов для ясности опущены): + +```console +Application Config Options: + --plugin arg Plugin(s) to enable, may be specified + multiple times + +Application Command Line Options: + -h [ --help ] Print this help message and exit. + -v [ --version ] Print version information. + --full-version Print full version information. + --print-default-config Print default configuration template + -d [ --data-dir ] arg Directory containing program runtime + data + --config-dir arg Directory containing configuration + files such as config.ini + -c [ --config ] arg (=config.ini) Configuration file name relative to + config-dir + -l [ --logconf ] arg (=logging.json) Logging configuration file name/path + for library users +``` + +## Опции плагинов + +Они управляют поведением плагинов `nodeos`. У каждой опции плагина уникальное имя, порядок в командной строке или `config.ini` произвольный. При указании опций плагина соответствующие плагины нужно включить через `--plugin`, иначе опции игнорируются. + +Подробности по опциям плагинов — в разделе [Плагины](../03_plugins/index.md). diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/01_nodeos-configuration.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/01_nodeos-configuration.md new file mode 100644 index 000000000..420739e41 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/01_nodeos-configuration.md @@ -0,0 +1,52 @@ +--- +content_title: Конфигурация nodeos +--- + +Опции плагинов задаются через аргументы CLI или файл `config.ini`. Опции, специфичные для `nodeos`, — только из командной строки. Полный список опций CLI и `config.ini` даёт `nodeos --help`, как показано выше. + +У каждой опции в `config.ini` есть соответствие в CLI, но не наоборот: часть опций CLI в `config.ini` недоступна. Например, большинство опций плагинов, выполняющих действия при старте, в `config.ini` не задаются — в частности `--delete-state-history` у `state_history_plugin`. + +Например, `--plugin eosio::chain_api_plugin` эквивалентно строке `plugin = eosio::chain_api_plugin` в `config.ini`. + +## Расположение `config.ini` + +По умолчанию на Linux `config.ini` находится в: +`~/.local/share/eosio/nodeos/config` + +Свой файл конфигурации задаётся опцией `nodeos` `--config path/to/config.ini`. + +## Пример nodeos + +Типичный запуск производящего узла: + +```sh +nodeos \ + -e -p eosio \ + --data-dir /users/mydir/eosio/data \ + --config-dir /users/mydir/eosio/config \ + --plugin eosio::producer_plugin \ + --plugin eosio::chain_plugin \ + --plugin eosio::http_plugin \ + --plugin eosio::state_history_plugin \ + --contracts-console \ + --access-control-allow-origin='*' \ + --http-validate-host=false \ + --verbose-http-errors \ + --state-history-dir /shpdata \ + --trace-history \ + --chain-state-history \ + >> nodeos.log 2>&1 & +``` + +Команда выше запускает производящий узел: + +* включает выпуск блоков (`-e`) +* задаёт имя продюсера `eosio` (`-p`) +* задаёт каталог данных блокчейна (`--data-dir`) +* задаёт каталог `config.ini` (`--config-dir`) +* подключает плагины `producer_plugin`, `chain_plugin`, `http_plugin`, `state_history_plugin` (`--plugin`) +* передаёт опции `chain_plugin` (`--contracts-console`) +* передаёт опции `http_plugin` (`--access-control-allow-origin`, `--http-validate-host`, `--verbose-http-errors`) +* передаёт опции state history (`--state-history-dir`, `--trace-history`, `--chain-state-history`) +* перенаправляет `stdout` и `stderr` в `nodeos.log` +* запускает процесс в фоне (`&`) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/00_producing-node.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/00_producing-node.md new file mode 100644 index 000000000..ecb0d1bed --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/00_producing-node.md @@ -0,0 +1,96 @@ +--- +content_title: Настройка производящего узла +--- + +!!! note "Нужны системные контракты" + Инструкции предполагают запуск производящего узла в сети с **загруженными системными контрактами**. На чистом dev-узле с нативной функциональностью или без системных контрактов шаги могут не сработать. + +Производящий **nodeos** в сети COOPOS подписывает и выпускает блоки; ниже — регистрация аккаунта как продюсера, `producer-name`, `signature-provider`, пиры и подключение `chain_plugin` / `producer_plugin`. Остальные возможности задаются [другими плагинами](../../03_plugins/index.md). + +## Перед началом + +* [Установка COOPOS](../../../00_install/index.md); в `PATH` — `nodeos`, `cleos`, `keosd`. + +[//]: # ( THIS IS A COMMENT LINK BELOW IS BROKEN ) +[//]: # ( If you built COOPOS using shell scripts, make sure to run the Install Script ../../../00_install/01_build-from-source/01_shell-scripts/03_install-COOPOS-binaries.md ) + +* [Опции nodeos](../../02_usage/00_nodeos-options.md) — по необходимости. + +## Шаги + +1. [Зарегистрировать аккаунт как продюсера](#1-register-your-account-as-a-producer) +2. [Задать имя продюсера](#2-set-producer-name) +3. [Настроить signature-provider продюсера](#3-set-the-producers-signature-provider) +4. [Задать список пиров](#4-define-a-peers-list) +5. [Подключить нужные плагины](#5-load-the-required-plugins) + +### 1. Зарегистрировать аккаунт как продюсера {#1-register-your-account-as-a-producer} + +Чтобы аккаунт мог быть продюсером, зарегистрируйте его: + +```sh +cleos system regproducer accountname1 EOS1234534... http://producer.site Antarctica +``` + +### 2. Имя продюсера {#2-set-producer-name} + +В `config.ini` задайте опцию `producer-name` на ваш аккаунт: + +```console +# config.ini: + +# ID of producer controlled by this node (e.g. inita; may specify multiple times) (eosio::producer_plugin) +producer-name = youraccount +``` + +### 3. Signature-provider продюсера {#3-set-the-producers-signature-provider} + +Нужен закрытый ключ продюсера; открытый ключ должен входить в authority аккаунта продюсера. + +`signature-provider` задаётся кортежем из трёх полей: +* `public-key` — валидный открытый ключ COOPOS в виде строки. +* `provider-spec` — строка вида `:` +* `provider-type` — KEY или KEOSD + +#### Через KEY: + +```console +# config.ini: + +signature-provider = PUBLIC_SIGNING_KEY=KEY:PRIVATE_SIGNING_KEY + +//Example +//signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 +``` + +#### Через keosd: +Можно использовать `keosd` вместо явного указания ключей. + +```console +# config.ini: + +signature-provider = KEOSD: + +//Example +//EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEOSD:https://127.0.0.1:88888 +``` + +### 4. Список пиров {#4-define-a-peers-list} + +```console +# config.ini: + +# Default p2p port is 9876 +p2p-peer-address = 123.255.78.9:9876 +``` + +### 5. Нужные плагины {#5-load-the-required-plugins} + +В [config.ini](../index.md) убедитесь, что подключены следующие плагины (или добавьте их): + +```console +# config.ini: + +plugin = eosio::chain_plugin +plugin = eosio::producer_plugin +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/01_non-producing-node.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/01_non-producing-node.md new file mode 100644 index 000000000..d2b351280 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/01_non-producing-node.md @@ -0,0 +1,39 @@ +--- +content_title: Настройка непроизводящего узла +--- + +Непроизводящий **nodeos** в COOPOS только синхронизируется с пирами и не подписывает блоки; RPC, историю состояния и прочее включают [плагины](../../03_plugins/index.md) (кроме `producer_plugin`). + +## Перед началом + +* [Установка COOPOS](../../../00_install/index.md); в `PATH` — `nodeos`, `cleos`, `keosd`. + +[//]: # ( THIS IS A COMMENT NEXT LINK CONTAINS A BROKEN LINK ) +[//]: # ( If you built COOPOS using shell scripts, make sure to run the Install Script ../../../00_install/01_build-from-source/01_shell-scripts/03_install-COOPOS-binaries.md ) + +* [Опции nodeos](../../02_usage/00_nodeos-options.md) — по необходимости. + +## Шаги + +1. [Задать пиров](#1-set-peers) +2. [Включить один или несколько плагинов](#2-enable-one-or-more-available-plugins) + +### 1. Пиры {#1-set-peers} + +Укажите пиров в `config.ini`, например: + +```console +# config.ini: + +p2p-peer-address = 106.10.42.238:9876 +``` + +Либо задайте пир при запуске `nodeos`: + +```sh +nodeos ... --p2p-peer-address=106.10.42.238:9876 +``` + +### 2. Плагины {#2-enable-one-or-more-available-plugins} + +Список — [Плагины nodeos](../../03_plugins/index.md). Например: [`state_history_plugin`](../../03_plugins/state_history_plugin/index.md) для полной истории, [`http_plugin`](../../03_plugins/http_plugin/index.md) для HTTP RPC. У плагинов бывают зависимости — их нужно подключить вместе с ними. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/index.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/index.md new file mode 100644 index 000000000..252c321ed --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/02_node-setups/index.md @@ -0,0 +1,12 @@ +--- +content_title: Типовые схемы узлов nodeos +--- + +`nodeos` обычно работает в двух режимах: + + * [Производящий узел](00_producing-node.md) + * [Непроизводящий узел](01_non-producing-node.md) + +**Производящие узлы** настроены на выпуск блоков. Они подключаются к P2P-сети и активно создают новые блоки. Свободные транзакции также проверяются и ретранслируются. В mainnet производящий узел выпускает блоки только если назначенный ему продюсер входит в активное расписание. + +**Непроизводящие узлы** подключаются к P2P, но сами блоки не выпускают; их используют как прокси, для ретрансляции API-запросов, проверки транзакций, распространения данных между узлами и т.д. Также они удобны для мониторинга состояния цепочки. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/00_local-single-node-testnet.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/00_local-single-node-testnet.md new file mode 100644 index 000000000..ad2f99e1e --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/00_local-single-node-testnet.md @@ -0,0 +1,119 @@ +--- +content_title: Локальная одноузловая тестовая сеть +--- + +На одной машине поднимается один производящий **nodeos** COOPOS (**single host, single-node testnet**). `cleos` вызывает действия в цепи и при необходимости сам поднимает `keosd`; отдельный `keosd` нужен, если держите кошелёк на фиксированном URL. + +![Single host single node testnet](single-host-single-node-testnet.png) + +## Перед началом + +* [Установка COOPOS](../../../00_install/index.md); в `PATH` — `nodeos`, `cleos`, `keosd`. + +[//]: # (THIS IS A COMMENT, NEXT LINK HAS BROKEN LINK) +[//]: # (If you built COOPOS using shell scripts, make sure to run the Install Script ../../../00_install/01_build-from-source/01_shell-scripts/03_install-COOPOS-binaries.md .) + +* [Опции nodeos](../../02_usage/00_nodeos-options.md) — по необходимости. + +## Шаги + +Откройте одно окно терминала: + +1. [Запустить производящий узел](#1-start-the-producer-node) +2. [Получить информацию об узле](#2-get-node-info) + +### 1. Запуск производящего узла {#1-start-the-producer-node} + +Одна команда для одноузлового блокчейна: + +```sh +nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin +``` + +!!! note "Минимальная конфигурация nodeos" + Минимально для выпуска блоков нужны `chain_api_plugin` и `history_api_plugin`, флаги `-e` (stale production) и `-p eosio` (имя продюсера `eosio`). Альтернатива — свой аккаунт в роли продюсера. + +После запуска `nodeos` в логе должны появиться сообщения о выпуске блоков. + +```console +1575001ms thread-0 chain_controller.cpp:235 _push_block ] initm #1 @2017-09-04T04:26:15 | 0 trx, 0 pending, exectime_ms=0 +1575001ms thread-0 producer_plugin.cpp:207 block_production_loo ] initm generated block #1 @ 2017-09-04T04:26:15 with 0 trxs 0 pending +1578001ms thread-0 chain_controller.cpp:235 _push_block ] initc #2 @2017-09-04T04:26:18 | 0 trx, 0 pending, exectime_ms=0 +1578001ms thread-0 producer_plugin.cpp:207 block_production_loo ] initc generated block #2 @ 2017-09-04T04:26:18 with 0 trxs 0 pending +... +eosio generated block 046b9984... #101527 @ 2018-04-01T14:24:58.000 with 0 trxs +eosio generated block 5e527ee2... #101528 @ 2018-04-01T14:24:58.500 with 0 trxs +... +``` +На этом этапе `nodeos` работает с одним продюсером — `eosio`. + +### 2. Информация об узле {#2-get-node-info} + +```sh +cleos get info +``` + +Пример ответа: + +```json +{ + "server_version": "0f9df63e", + "chain_id": "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", + "head_block_num": 134, + "last_irreversible_block_num": 133, + "last_irreversible_block_id": "00000085060e9872849ef87bef3b19ab07de9faaed71154510c7f0aeeaddae2c", + "head_block_id": "000000861e3222dce1c7c2cfb938940d8aac22c816cc8b0b89f6bf65a8ad5bdc", + "head_block_time": "2019-11-18T22:13:10.500", + "head_block_producer": "eosio", + "virtual_block_cpu_limit": 228396, + "virtual_block_net_limit": 1197744, + "block_cpu_limit": 199900, + "block_net_limit": 1048576, + "server_version_string": "v2.0.0-rc2", + "fork_db_head_block_num": 134, + "fork_db_head_block_id": "000000861e3222dce1c7c2cfb938940d8aac22c816cc8b0b89f6bf65a8ad5bdc", + "server_full_version_string": "v2.0.0-rc2-0f9df63e1eca4dda4cb7df30683f4a1220599444" +} +``` + +## Дополнительные шаги + +Продвинутым пользователям часто нужна своя конфигурация. У `nodeos` отдельный каталог конфигурации; путь зависит от ОС. + +* macOS: `~/Library/Application\ Support/eosio/nodeos/config` +* Linux: `~/.local/share/eosio/nodeos/config` + +При сборке в каталог кладётся типовой `genesis.json`. Свой каталог конфигурации задаётся `--config-dir`; при его использовании `genesis.json` нужно скопировать вручную. + +Для осмысленной работы нужен корректный `config.ini`. При старте `nodeos` ищет `config.ini` в каталоге конфигурации; если файла нет, создаётся по умолчанию. Если готового `config.ini` нет, запустите `nodeos` и сразу остановите Ctrl-C — появится файл по умолчанию. Отредактируйте `config.ini`, добавив или изменив: + +```console +# config.ini: + + # Enable production on a stale chain, since a single-node test chain is pretty much always stale + enable-stale-production = true + # Enable block production with the testnet producers + producer-name = eosio + # Load the block producer plugin, so you can produce blocks + plugin = eosio::producer_plugin + # As well as API and HTTP plugins + plugin = eosio::chain_api_plugin + plugin = eosio::http_plugin + plugin = eosio::history_api_plugin +``` + +Затем снова запустите `nodeos`: + +```sh +nodeos +``` + +Данные времени выполнения (shared memory, логи и т.д.) лежат в каталоге данных: + +* macOS: `~/Library/Application\ Support/eosio/nodeos/data` +* Linux: `~/.local/share/eosio/nodeos/data` + +Каталог данных задаётся `--data-dir`. + +!!! note "Дальше" + Далее — [локальная многоузловая тестовая сеть на одном хосте](01_local-multi-node-testnet.md). diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/01_local-multi-node-testnet.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/01_local-multi-node-testnet.md new file mode 100644 index 000000000..69abe2301 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/01_local-multi-node-testnet.md @@ -0,0 +1,209 @@ +--- +content_title: Локальная многоузловая тестовая сеть +--- + +Два производящих **nodeos** на одном хосте (**single host, multi-node testnet**): отдельные порты HTTP/P2P и каталоги `config`/`data`, связь через `cleos` и при необходимости `keosd`. Схема ниже. + +![Single host multi node testnet](single-host-multi-node-testnet.png) + +## Перед началом + +* [Установка COOPOS](../../../00_install/index.md); в `PATH` — `nodeos`, `cleos`, `keosd`. +* [Опции nodeos](../../02_usage/00_nodeos-options.md) — по необходимости. + +## Шаги + +Откройте четыре окна терминала. + +1. [Запустить менеджер кошельков](#1-start-the-wallet-manager) +2. [Создать кошелёк по умолчанию](#2-create-a-default-wallet) +3. [Импортировать ключ COOPOS](#3-loading-the-COOPOS-key) +4. [Запустить первый производящий узел](#4-start-the-first-producer-node) +5. [Запустить второй производящий узел](#5-start-the-second-producer-node) +6. [Получить информацию об узлах](#6-get-nodes-info) + +### 1. Менеджер кошельков {#1-start-the-wallet-manager} + +В первом терминале запустите `keosd`: + +```sh +keosd --http-server-address 127.0.0.1:8899 +``` + +При успехе в начале вывода будут строки вроде: + +```console +2493323ms thread-0 wallet_plugin.cpp:39 plugin_initialize ] initializing wallet plugin +2493323ms thread-0 http_plugin.cpp:141 plugin_initialize ] host: 127.0.0.1 port: 8899 +2493323ms thread-0 http_plugin.cpp:144 plugin_initialize ] configured http to listen on 127.0.0.1:8899 +2493323ms thread-0 http_plugin.cpp:213 plugin_startup ] start listening for http requests +2493324ms thread-0 wallet_api_plugin.cpp:70 plugin_startup ] starting wallet_api_plugin +``` + +В логе должна появиться строка про `127.0.0.1:8899`; иначе смотрите ошибку и перезапустите `keosd`. Окно с `keosd` не закрывайте — переходите ко второму терминалу. + +### 2. Кошелёк по умолчанию {#2-create-a-default-wallet} + +Во втором терминале создайте кошелёк через `cleos`: + +```sh +cleos --wallet-url http://127.0.0.1:8899 wallet create --to-console +``` + +`cleos` сообщит о создании кошелька `default` и выдаст пароль — сохраните его. Пример вывода: + +```console +Creating wallet: default +Save password to use in the future to unlock this wallet. +Without password imported keys will not be retrievable. +"PW5JsmfYz2wrdUEotTzBamUCAunAA8TeRZGT57Ce6PkvM12tre8Sm" +``` + +В окне `keosd` появятся служебные сообщения. Дальнейшие команды `cleos` выполняйте во втором терминале. + +### 3. Ключ COOPOS {#3-loading-the-COOPOS-key} + +Приватная тестовая цепочка создаётся с типовым начальным ключом — его нужно импортировать в кошелёк. + +```sh +cleos --wallet-url http://127.0.0.1:8899 wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 +``` + +```console +imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV +``` + +### 4. Первый производящий узел {#4-start-the-first-producer-node} + +В третьем терминале: + +```sh +nodeos --enable-stale-production --producer-name eosio --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin +``` + +Получается специальный «bios»-продюсер. При успехе в логе `nodeos` виден выпуск блоков. + +### 5. Второй производящий узел {#5-start-the-second-producer-node} + +[//]: # (don't render for now) +[//]: # (The following commands assume that you are running this tutorial from the `eos\build` directory, from which you ran `./eosio_build.sh` to build the COOPOS binaries.) + +Загрузите на `eosio` контракт `eosio.bios` (ресурсы аккаунтов и привилегированные вызовы). Во втором терминале: + +```sh +cleos --wallet-url http://127.0.0.1:8899 set contract eosio build/contracts/eosio.bios +``` + +Создайте аккаунт-продюсер `inita`: сгенерируйте ключи и импортируйте закрытый в кошелёк. + +```sh +cleos create key +``` + +!!! warning "Внимание" + Дальнейшие команды используют пары ключей из примера ниже. Чтобы копировать команды без правок, возьмите именно эти ключи, а не результат своей команды `cleos create key`. Если используете свои ключи — подставьте их во все следующие команды. + +Типичный вывод `cleos create key`: + +```console +Private key: 5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr +Public key: EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg +``` + +Импорт закрытого ключа: + +```sh +cleos --wallet-url http://127.0.0.1:8899 wallet import 5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr +``` + +```console +imported private key for: EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg +``` + +Создание аккаунта `inita`: для `create account` нужны два открытых ключа — owner и active; здесь один и тот же ключ используется дважды. + +```sh +cleos --wallet-url http://127.0.0.1:8899 create account eosio inita EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg +``` + +```console +executed transaction: d1ea511977803d2d88f46deb554f5b6cce355b9cc3174bec0da45fc16fe9d5f3 352 bytes 102400 cycles +# eosio <= eosio::newaccount {"creator":"eosio","name":"inita","owner":{"threshold":1,"keys":[{"key":"EOS6hMjoWRF2L8x9YpeqtUEcsDKA... +``` + +Аккаунт готов; в других руководствах на него вешают контракты — здесь он станет продюсером блоков. + +В четвёртом терминале запустите второй экземпляр `nodeos`. Командная строка длиннее, чтобы не конфликтовать с первым узлом. Можно скопировать команду и при необходимости поправить ключи: + +```sh +nodeos --producer-name inita --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin --http-server-address 127.0.0.1:8889 --p2p-listen-endpoint 127.0.0.1:9877 --p2p-peer-address 127.0.0.1:9876 --config-dir node2 --data-dir node2 --signature-provider EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg=KEY:5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr +``` + +У нового узла в логе будет немного активности, затем тишина до последнего шага — пока `inita` не зарегистрирован как продюсер. Ниже пример хвоста лога (у вас могут отличаться времена): + +```console +2393147ms thread-0 producer_plugin.cpp:176 plugin_startup ] producer plugin: plugin_startup() end +2393157ms thread-0 net_plugin.cpp:1271 start_sync ] Catching up with chain, our last req is 0, theirs is 8249 peer dhcp15.ociweb.com:9876 - 295f5fd +2393158ms thread-0 chain_controller.cpp:1402 validate_block_heade ] head_block_time 2018-03-01T12:00:00.000, next_block 2018-04-05T22:31:08.500, block_interval 500 +2393158ms thread-0 chain_controller.cpp:1404 validate_block_heade ] Did not produce block within block_interval 500ms, took 3061868500ms) +2393512ms thread-0 producer_plugin.cpp:241 block_production_loo ] Not producing block because production is disabled until we receive a recent block (see: --enable-stale-production) +2395680ms thread-0 net_plugin.cpp:1385 recv_notice ] sync_manager got last irreversible block notice +2395680ms thread-0 net_plugin.cpp:1271 start_sync ] Catching up with chain, our last req is 8248, theirs is 8255 peer dhcp15.ociweb.com:9876 - 295f5fd +2396002ms thread-0 producer_plugin.cpp:226 block_production_loo ] Previous result occurred 5 times +2396002ms thread-0 producer_plugin.cpp:244 block_production_loo ] Not producing block because it isn't my turn, its eosio +``` + +Сейчас второй `nodeos` — «простаивающий» продюсер. Чтобы он стал активным, зарегистрируйте `inita` у bios-узла и обновите расписание продюсеров: + +```sh +cleos --wallet-url http://127.0.0.1:8899 push action eosio setprods "{ \"schedule\": [{\"producer_name\": \"inita\",\"block_signing_key\": \"EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg\"}]}" -p eosio@active +``` + +```console +executed transaction: 2cff4d96814752aefaf9908a7650e867dab74af02253ae7d34672abb9c58235a 272 bytes 105472 cycles +# eosio <= eosio::setprods {"version":1,"producers":[{"producer_name":"inita","block_signing_key":"EOS6hMjoWRF2L8x9YpeqtUEcsDKA... +``` + +Двухузловая тестовая сеть готова. Исходный узел перестаёт выпускать блоки, но продолжает их получать. Проверьте `get info` на каждом узле. + +### 6. Информация об узлах {#6-get-nodes-info} + +Первый узел: + +```sh +cleos get info +``` + +Пример ответа: + +```json +{ + "server_version": "223565e8", + "head_block_num": 11412, + "last_irreversible_block_num": 11411, + "head_block_id": "00002c94daf7dff456cd940bd585c4d9b38e520e356d295d3531144329c8b6c3", + "head_block_time": "2018-04-06T00:06:14", + "head_block_producer": "inita" +} +``` + +Второй узел: + +```sh +cleos --url http://127.0.0.1:8889 get info +``` + +Пример ответа: + +```json +{ + "server_version": "223565e8", + "head_block_num": 11438, + "last_irreversible_block_num": 11437, + "head_block_id": "00002cae32697444fa9a2964e4db85b5e8fd4c8b51529a0c13e38587c1bf3c6f", + "head_block_time": "2018-04-06T00:06:27", + "head_block_producer": "inita" +} +``` + +Сеть на нескольких физических хостах настраивается отдельно. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/index.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/index.md new file mode 100644 index 000000000..c27f5036c --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/index.md @@ -0,0 +1,30 @@ +--- +content_title: Среда разработки +--- + +Среду `nodeos` для разработки и тестов можно собрать по-разному; выбор зависит от целей проекта. Ниже — практичные варианты. + +## Локальная одноузловая тестовая сеть + +Подходит разработчикам смарт-контрактов, будущим продюсерам и операторам непроизводящих узлов. Минимальная конфигурация и мало требований. + +* [Настроить nodeos как локальную одноузловую тестовую сеть](00_local-single-node-testnet.md) + +## Локальная многоузловая тестовая сеть + +Технически пригодна и для разработки контрактов, но часто избыточна. Полезна при работе с ядром: бенчмарки, оптимизация, эксперименты; также для обучения и проверки идей. + +* [Настроить nodeos как локальную двухузловую тестовую сеть](01_local-multi-node-testnet.md) +* [Настроить nodeos как локальную 21-узловую тестовую сеть](/tutorials/bios-boot-tutorial.md) + +## Официальный тестовый узел + +Для простого старта и кроссплатформенности можно использовать инструменты вроде [DUNE](https://github.com/AntelopeIO/DUNE) (Docker) либо следовать [инструкциям в репозитории COOPOS](https://github.com/coopenomics/coopos). + +## Сторонние тестовые сети + +Для тестирования dApp и контрактов COOPOS доступны сторонние тестнеты: + +* Jungle Testnet: [монитор](https://monitor.jungletestnet.io/), [сайт](https://jungletestnet.io/) +* [CryptoKylin Testnet](https://www.cryptokylin.io/) +* [Telos Testnet](https://mon-test.telosfoundation.io/) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/single-host-multi-node-testnet.png b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/03_development-environment/single-host-multi-node-testnet.png new file mode 100644 index 0000000000000000000000000000000000000000..86b63c571f36bee71d72e9bed282ec8d9bd53af2 GIT binary patch literal 213042 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%0DreFBOX2&%~KqSy?Z3JAS3ZUp|1|? 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

R{j2E5riT-( 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

qOz_A1kS| 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�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 literal 0 HcmV?d00001 diff --git a/docs/documentation/blockchain/coopos/01_nodeos/02_usage/index.md b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/index.md new file mode 100644 index 000000000..4e644557e --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/02_usage/index.md @@ -0,0 +1,10 @@ +--- +content_title: Использование nodeos +--- + +Здесь описано, как пользоваться `nodeos`, перечислены опции конфигурации, раскладка файлов на диске, типовые конфигурации узлов и варианты тестовой среды для разработки. + +* [Опции](00_nodeos-options.md) — запуск `nodeos`; опции самого `nodeos` и плагинов. +* [Конфигурация](01_nodeos-configuration.md) — CLI и `config.ini`; пример `nodeos`. +* [Типовые схемы узлов](02_node-setups/index.md) — производящий и непроизводящий узлы. +* [Среда разработки](03_development-environment/index.md) — тестовая сеть для разработки. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/api-reference/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/api-reference/index.md new file mode 100644 index 000000000..353b10f67 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/api-reference/index.md @@ -0,0 +1 @@ +[Справочник Chain API](https://docs.eosnetwork.com/coopos-plugins/latest/chain.api/) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/index.md new file mode 100644 index 000000000..dc118ccf6 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_api_plugin/index.md @@ -0,0 +1,38 @@ +## Описание + +Плагин `chain_api_plugin` выставляет возможности [`chain_plugin`](../chain_plugin/index.md) через RPC API, которое обслуживает [`http_plugin`](../http_plugin/index.md). + +## Использование + +```console +# config.ini +plugin = eosio::chain_api_plugin +``` +```sh +# command-line +nodeos ... --plugin eosio::chain_api_plugin +``` + +## Опции + +Нет + +## Зависимости + +* [`chain_plugin`](../chain_plugin/index.md) +* [`http_plugin`](../http_plugin/index.md) + +### Примеры загрузки зависимостей + +```console +# config.ini +plugin = eosio::chain_plugin +[options] +plugin = eosio::http_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::chain_plugin [operations] [options] \ + --plugin eosio::http_plugin [options] +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_plugin/index.md new file mode 100644 index 000000000..592ea123f --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/chain_plugin/index.md @@ -0,0 +1,244 @@ +## Описание + +Плагин `chain_plugin` — обязательный базовый модуль для обработки и агрегирования данных цепочки на узле COOPOS. + +## Использование + +```console +# config.ini +plugin = eosio::chain_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::chain_plugin [operations] [options] +``` + +## Операции (только CLI) + +Задаются только в командной строке `nodeos`: + +```console +Command Line Options for eosio::chain_plugin: + --genesis-json arg File to read Genesis State from + --genesis-timestamp arg override the initial timestamp in the + Genesis State file + --print-genesis-json extract genesis_state from blocks.log + as JSON, print to console, and exit + --extract-genesis-json arg extract genesis_state from blocks.log + as JSON, write into specified file, and + exit + --print-build-info print build environment information to + console as JSON and exit + --extract-build-info arg extract build environment information + as JSON, write into specified file, and + exit + --force-all-checks do not skip any validation checks while + replaying blocks (useful for replaying + blocks from untrusted source) + --disable-replay-opts disable optimizations that specifically + target replay + --replay-blockchain clear chain state database and replay + all blocks + --hard-replay-blockchain clear chain state database, recover as + many blocks as possible from the block + log, and then replay those blocks + --delete-all-blocks clear chain state database and block + log + --truncate-at-block arg (=0) stop hard replay / block log recovery + at this block number (if set to + non-zero number) + --terminate-at-block arg (=0) terminate after reaching this block + number (if set to a non-zero number) + --snapshot arg File to read Snapshot State from + +``` + +## Опции + +Доступны и в командной строке `nodeos`, и в `config.ini`: + +```console +Config Options for eosio::chain_plugin: + --blocks-dir arg (="blocks") the location of the blocks directory + (absolute path or relative to + application data dir) + --state-dir arg (="state") the location of the state directory + (absolute path or relative to + application data dir) + --protocol-features-dir arg (="protocol_features") + the location of the protocol_features + directory (absolute path or relative to + application config dir) + --checkpoint arg Pairs of [BLOCK_NUM,BLOCK_ID] that + should be enforced as checkpoints. + --wasm-runtime runtime (=eos-vm-jit) Override default WASM runtime ( + "eos-vm-jit", "eos-vm") + "eos-vm-jit" : A WebAssembly runtime + that compiles WebAssembly code to + native x86 code prior to execution. + "eos-vm" : A WebAssembly interpreter. + + --profile-account arg The name of an account whose code will + be profiled + --abi-serializer-max-time-ms arg (=15) + Override default maximum ABI + serialization time allowed in ms + --chain-state-db-size-mb arg (=1024) Maximum size (in MiB) of the chain + state database + --chain-state-db-guard-size-mb arg (=128) + Safely shut down node when free space + remaining in the chain state database + drops below this size (in MiB). + --signature-cpu-billable-pct arg (=50) + Percentage of actual signature recovery + cpu to bill. Whole number percentages, + e.g. 50 for 50% + --chain-threads arg (=2) Number of worker threads in controller + thread pool + --contracts-console print contract's output to console + --deep-mind print deeper information about chain + operations + --actor-whitelist arg Account added to actor whitelist (may + specify multiple times) + --actor-blacklist arg Account added to actor blacklist (may + specify multiple times) + --contract-whitelist arg Contract account added to contract + whitelist (may specify multiple times) + --contract-blacklist arg Contract account added to contract + blacklist (may specify multiple times) + --action-blacklist arg Action (in the form code::action) added + to action blacklist (may specify + multiple times) + --key-blacklist arg Public key added to blacklist of keys + that should not be included in + authorities (may specify multiple + times) + --sender-bypass-whiteblacklist arg Deferred transactions sent by accounts + in this list do not have any of the + subjective whitelist/blacklist checks + applied to them (may specify multiple + times) + --read-mode arg (=head) Database read mode ("head", + "irreversible", "speculative"). + In "head" mode: database contains state + changes up to the head block; + transactions received by the node are + relayed if valid. + In "irreversible" mode: database + contains state changes up to the last + irreversible block; transactions + received via the P2P network are not + relayed and transactions cannot be + pushed via the chain API. + In "speculative" mode: database + contains state changes by transactions + in the blockchain up to the head block + as well as some transactions not yet + included in the blockchain; + transactions received by the node are + relayed if valid. + --api-accept-transactions arg (=1) Allow API transactions to be evaluated + and relayed if valid. + --validation-mode arg (=full) Chain validation mode ("full" or + "light"). + In "full" mode all incoming blocks will + be fully validated. + In "light" mode all incoming blocks + headers will be fully validated; + transactions in those validated blocks + will be trusted + + --disable-ram-billing-notify-checks Disable the check which subjectively + fails a transaction if a contract bills + more RAM to another account within the + context of a notification handler (i.e. + when the receiver is not the code of + the action). + --maximum-variable-signature-length arg (=16384) + Subjectively limit the maximum length + of variable components in a variable + legnth signature to this size in bytes + --trusted-producer arg Indicate a producer whose blocks + headers signed by it will be fully + validated, but transactions in those + validated blocks will be trusted. + --database-map-mode arg (=mapped) Database map mode ("mapped", + "mapped_private", "heap", or "locked"). + In "mapped" mode database is memory + mapped as a file. + In "mapped_private" mode database is + memory mapped as a file using a private + mapping (no disk writeback until + program exit). + In "heap" mode database is preloaded in + to swappable memory and will use huge + pages if available. + In "locked" mode database is preloaded, + locked in to memory, and will use huge + pages if available. + + --eos-vm-oc-cache-size-mb arg (=1024) Maximum size (in MiB) of the EOS VM OC + code cache + --eos-vm-oc-compile-threads arg (=1) Number of threads to use for EOS VM OC + tier-up + --eos-vm-oc-enable arg (=auto) Enable EOS VM OC tier-up runtime + ('auto', 'all', 'none'). + 'auto' - EOS VM OC tier-up is enabled + for eosio.* accounts, read-only trxs, + and applying blocks. + 'all' - EOS VM OC tier-up is enabled + for all contract execution. + 'none' - EOS VM OC tier-up is + completely disabled. + + --enable-account-queries arg (=0) enable queries to find accounts by + various metadata. + --transaction-retry-max-storage-size-gb arg + Maximum size (in GiB) allowed to be + allocated for the Transaction Retry + feature. Setting above 0 enables this + feature. + --transaction-retry-interval-sec arg (=20) + How often, in seconds, to resend an + incoming transaction to network if not + seen in a block. + Needs to be at least twice as large as + p2p-dedup-cache-expire-time-sec. + --transaction-retry-max-expiration-sec arg (=120) + Maximum allowed transaction expiration + for retry transactions, will retry + transactions up to this value. + Should be larger than + transaction-retry-interval-sec. + --transaction-finality-status-max-storage-size-gb arg + Maximum size (in GiB) allowed to be + allocated for the Transaction Finality + Status feature. Setting above 0 enables + this feature. + --transaction-finality-status-success-duration-sec arg (=180) + Duration (in seconds) a successful + transaction's Finality Status will + remain available from being first + identified. + --transaction-finality-status-failure-duration-sec arg (=180) + Duration (in seconds) a failed + transaction's Finality Status will + remain available from being first + identified. + --integrity-hash-on-start Log the state integrity hash on startup + --integrity-hash-on-stop Log the state integrity hash on + shutdown + --block-log-retain-blocks arg If set to greater than 0, periodically + prune the block log to store only + configured number of most recent + blocks. + If set to 0, no blocks are be written + to the block log; block log file is + removed after startup. + +``` + +## Зависимости + +Нет diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/api-reference/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/api-reference/index.md new file mode 100644 index 000000000..9c263fdce --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/api-reference/index.md @@ -0,0 +1 @@ +[Справочник DB Size API](https://docs.eosnetwork.com/coopos-plugins/latest/db_size.api/) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/index.md new file mode 100644 index 000000000..8642be243 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/db_size_api_plugin/index.md @@ -0,0 +1,40 @@ +## Описание + +Плагин `db_size_api_plugin` возвращает аналитику по блокчейну: + +* free_bytes +* used_bytes +* size +* indices + + + +## Опции + +Нет + +## Зависимости + +* [`chain_plugin`](../chain_plugin/index.md) +* [`http_plugin`](../http_plugin/index.md) + +### Примеры загрузки зависимостей + +```console +# config.ini +plugin = eosio::chain_plugin +[options] +plugin = eosio::http_plugin +[options] +``` +```sh +# командная строка +nodeos ... --plugin eosio::chain_plugin [operations] [options] \ + --plugin eosio::http_plugin [options] +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/http_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/http_plugin/index.md new file mode 100644 index 000000000..34445d250 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/http_plugin/index.md @@ -0,0 +1,72 @@ +## Описание + +Плагин `http_plugin` поддерживается и `nodeos`, и `keosd`. Нужен для любой функциональности RPC API у экземпляра `nodeos` или `keosd`. + +## Использование + +```console +# config.ini +plugin = eosio::http_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::http_plugin [options] + (or) +keosd ... --plugin eosio::http_plugin [options] +``` + +## Опции + +Задаются в командной строке и в `config.ini`: + +```console +Config Options for eosio::http_plugin: + --unix-socket-path arg The filename (relative to data-dir) to + create a unix socket for HTTP RPC; set + blank to disable. + --http-server-address arg (=127.0.0.1:8888) + The local IP and port to listen for + incoming http connections; set blank to + disable. + --access-control-allow-origin arg Specify the Access-Control-Allow-Origin + to be returned on each request + --access-control-allow-headers arg Specify the Access-Control-Allow-Header + s to be returned on each request + --access-control-max-age arg Specify the Access-Control-Max-Age to + be returned on each request. + --access-control-allow-credentials Specify if Access-Control-Allow-Credent + ials: true should be returned on each + request. + --max-body-size arg (=2097152) The maximum body size in bytes allowed + for incoming RPC requests + --http-max-bytes-in-flight-mb arg (=500) + Maximum size in megabytes http_plugin + should use for processing http + requests. -1 for unlimited. 429 error + response when exceeded. + --http-max-in-flight-requests arg (=-1) + Maximum number of requests http_plugin + should use for processing http + requests. 429 error response when + exceeded. + --http-max-response-time-ms arg (=30) Maximum time for processing a request, + -1 for unlimited + --verbose-http-errors Append the error log to HTTP responses + --http-validate-host arg (=1) If set to false, then any incoming + "Host" header is considered valid + --http-alias arg Additionaly acceptable values for the + "Host" header of incoming HTTP + requests, can be specified multiple + times. Includes http/s_server_address + by default. + --http-threads arg (=2) Number of worker threads in http thread + pool + --http-keep-alive arg (=1) If set to false, do not keep HTTP + connections alive, even if client + requests. +``` + +## Зависимости + +Нет diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/index.md new file mode 100644 index 000000000..b339d83bd --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/index.md @@ -0,0 +1,24 @@ +--- +content_title: Плагины nodeos +--- + +## Обзор + +Плагины расширяют базовую функциональность `nodeos`. Обязательные включают `chain_plugin`, `net_plugin` и `producer_plugin` — это отражает модульность `nodeos`. Остальные опциональны: удобные функции, но не обязательные для работы узла. + +Описание конкретных плагинов — в списке: + +* [`chain_api_plugin`](chain_api_plugin/index.md) +* [`chain_plugin`](chain_plugin/index.md) +* [`db_size_api_plugin`](db_size_api_plugin/index.md) +* [`http_plugin`](http_plugin/index.md) +* [`net_api_plugin`](net_api_plugin/index.md) +* [`net_plugin`](net_plugin/index.md) +* [`producer_plugin`](producer_plugin/index.md) +* [`state_history_plugin`](state_history_plugin/index.md) +* [`test_control_api_plugin`](test_control_api_plugin/index.md) +* [`test_control_plugin`](test_control_plugin/index.md) +* [`trace_api_plugin`](trace_api_plugin/index.md) + +!!! note "Модульность nodeos" + Плагины добавляют возможности по шагам. В отличие от динамически подключаемых модулей, плагины `nodeos` собираются на этапе компиляции. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/api-reference/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/api-reference/index.md new file mode 100644 index 000000000..0b7cdb46c --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/api-reference/index.md @@ -0,0 +1 @@ +[Справочник Net API](https://docs.eosnetwork.com/coopos-plugins/latest/net.api/) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/index.md new file mode 100644 index 000000000..cf1a95037 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_api_plugin/index.md @@ -0,0 +1,49 @@ +## Описание +Плагин `net_api_plugin` выставляет функции `net_plugin` через RPC API, которое ведёт `http_plugin`. Операторы узла могут управлять P2P-соединениями активного узла. + +У `net_api_plugin` четыре конечные точки RPC API: + +* connect +* disconnect +* connections +* status + +См. [документацию Net API](https://docs.eosnetwork.com/coopos-plugins/latest/net.api/). + +!!! warning "Осторожно" + Плагин открывает управление P2P-соединениями. Не рекомендуется включать его на публично доступном узле — возможна эксплуатация. + +## Использование + +```console +# config.ini +plugin = eosio::net_api_plugin +``` +```sh +# command-line +nodeos ... --plugin eosio::net_api_plugin +``` + +## Опции + +Нет + +## Зависимости + +* [`net_plugin`](../net_plugin/index.md) +* [`http_plugin`](../http_plugin/index.md) + +### Примеры загрузки зависимостей + +```console +# config.ini +plugin = eosio::net_plugin +[options] +plugin = eosio::http_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::net_plugin [options] \ + --plugin eosio::http_plugin [options] +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_plugin/index.md new file mode 100644 index 000000000..1b97ee304 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/net_plugin/index.md @@ -0,0 +1,107 @@ +## Описание + +Плагин `net_plugin` реализует аутентифицированный P2P-протокол для устойчивой синхронизации узлов. + +## Использование + +```console +# config.ini +plugin = eosio::net_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::net_plugin [options] +``` + +## Опции + +Задаются в командной строке `nodeos` и в `config.ini`: + +```console +Config Options for eosio::net_plugin: + --p2p-listen-endpoint arg (=0.0.0.0:9876) + The actual host:port used to listen for + incoming p2p connections. + --p2p-server-address arg An externally accessible host:port for + identifying this node. Defaults to + p2p-listen-endpoint. + --p2p-peer-address arg The public endpoint of a peer node to + connect to. Use multiple + p2p-peer-address options as needed to + compose a network. + Syntax: host:port[:|] + The optional 'trx' and 'blk' + indicates to node that only + transactions 'trx' or blocks 'blk' + should be sent. Examples: + p2p.example.org:9876 + p2p.trx.example.org:9876:trx + p2p.blk.example.org:9876:blk + + --p2p-max-nodes-per-host arg (=1) Maximum number of client nodes from any + single IP address + --p2p-accept-transactions arg (=1) Allow transactions received over p2p + network to be evaluated and relayed if + valid. + --agent-name arg (=EOS Test Agent) The name supplied to identify this node + amongst the peers. + --allowed-connection arg (=any) Can be 'any' or 'producers' or + 'specified' or 'none'. If 'specified', + peer-key must be specified at least + once. If only 'producers', peer-key is + not required. 'producers' and + 'specified' may be combined. + --peer-key arg Optional public key of peer allowed to + connect. May be used multiple times. + --peer-private-key arg Tuple of [PublicKey, WIF private key] + (may specify multiple times) + --max-clients arg (=25) Maximum number of clients from which + connections are accepted, use 0 for no + limit + --connection-cleanup-period arg (=30) number of seconds to wait before + cleaning up dead connections + --max-cleanup-time-msec arg (=10) max connection cleanup time per cleanup + call in milliseconds + --p2p-dedup-cache-expire-time-sec arg (=10) + Maximum time to track transaction for + duplicate optimization + --net-threads arg (=2) Number of worker threads in net_plugin + thread pool + --sync-fetch-span arg (=100) number of blocks to retrieve in a chunk + from any individual peer during + synchronization + --use-socket-read-watermark arg (=0) Enable experimental socket read + watermark optimization + --peer-log-format arg (=["${_name}" - ${_cid} ${_ip}:${_port}] ) + The string used to format peers when + logging messages about them. Variables + are escaped with ${}. + Available Variables: + _name self-reported name + + _cid assigned connection id + + _id self-reported ID (64 hex + characters) + + _sid first 8 characters of + _peer.id + + _ip remote IP address of peer + + _port remote port number of peer + + _lip local IP address connected to + peer + + _lport local port number connected + to peer + --p2p-keepalive-interval-ms arg (=10000) + peer heartbeat keepalive message + interval in milliseconds +``` + +## Зависимости + +Нет diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/api-reference/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/api-reference/index.md new file mode 100644 index 000000000..7cfca7a34 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/api-reference/index.md @@ -0,0 +1 @@ +[Справочник Producer API](https://docs.eosnetwork.com/coopos-plugins/latest/producer.api/) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/index.md new file mode 100644 index 000000000..d944ca6ac --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_api_plugin/index.md @@ -0,0 +1,42 @@ +## Описание + +Плагин `producer_api_plugin` выставляет ряд конечных точек [`producer_plugin`](../producer_plugin/index.md) через RPC API под управлением [`http_plugin`](../http_plugin/index.md). + +## Использование + +```console +# config.ini +plugin = eosio::producer_api_plugin +``` +```sh +# параметры запуска nodeos +nodeos ... --plugin eosio::producer_api_plugin +``` + +## Опции + +Нет + +## Зависимости + +* [`producer_plugin`](../producer_plugin/index.md) +* [`chain_plugin`](../chain_plugin/index.md) +* [`http_plugin`](../http_plugin/index.md) + +### Примеры загрузки зависимостей + +```console +# config.ini +plugin = eosio::producer_plugin +[options] +plugin = eosio::chain_plugin +[options] +plugin = eosio::http_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::producer_plugin [options] \ + --plugin eosio::chain_plugin [operations] [options] \ + --plugin eosio::http_plugin [options] +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/10_block-producing-explained.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/10_block-producing-explained.md new file mode 100644 index 000000000..e33c500f0 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/10_block-producing-explained.md @@ -0,0 +1,85 @@ +--- +content_title: Как устроен выпуск блоков +--- + +Для наглядности введём обозначения: + +* `r` = `producer_repetitions = 12` (жёстко задано) +* `m` = `max_block_cpu_usage` (консенсус в цепочке) +* `u` = `max_block_net_usage` (консенсус в цепочке) +* `t` = `block-time` +* `e` = `produce-block-offset-ms` (конфигурация nodeos) +* `w` = `block-time-interval = 500ms` (жёстко задано) +* `a` = `produce-block-early-amount = w - (w - (e / r)) = e / r ms` (насколько раньше выпускается каждый блок раунда) +* `l` = `produce block time = t - a` +* `p` = `окно выпуска блока = w - a` (доступное время стеновых часов на один блок) +* `c` = `billed_cpu_in_block = minimum(m, w - a)` +* `n` = `задержка сети TCP/IP` +* `h` = `время проверки заголовка блока, мс` + +Валидация на пирах при схожем железе/версии/конфиге занимает ≤ `m` + +**Пример: два BP и топология сети на схеме** + +``` + +------+ +------+ +------+ +------+ + -->| BP-A |---->| BP-A |------>| BP-B |---->| BP-B | + +------+ | Peer | | Peer | +------+ + +------+ +------+ +``` + +`BP-A` отправляет блок в момент `l`, а `BP-B` должен получить блок к моменту `t`, иначе блок отбрасывается. + +Если `BP-A` выпускает 12 блоков в моменты `b(lock) at t(ime) 1`, `bt 1.5`, `bt 2`, …, `bt 6.5`, то `BP-B` должен получить `bt 6.5` к моменту `6.5`, чтобы осталось `0.5` на выпуск `bt 7`. + +Время `bt 7` минус `0.5` совпадает со временем `bt 6.5`, то есть `t` — время последнего блока `BP-A`, с которого `BP-B` должен начать свой первый блок. + +Блок выпускается и отправляется, когда достигнут один из пределов: `m`, `u` или `p`. + +Начиная с COOPOS 4.0, блоки распространяются после проверки заголовка. Вместо того чтобы пирам `BP-A` и `BP-B` тратить время порядка `m` на полную валидацию и пересылку, проверяется заголовок за миллисекунды и блок пересылается дальше. + +Начиная с COOPOS 5.0, блоки в раунде стартуют сразу после завершения предыдущего. До 5.0 блоки всегда начинались с шагом `w`, и узел мог «спать» между блоками. В 5.0 паузы сдвинуты к концу раунда выпуска. + +## Пример 1: блок приходит на 110 мс раньше +* Нулевая сетевая задержка между всеми узлами. +* Блоки не упираются в `m`, время выпуска каждого — `w - a`. +* Время завершения блока и подписи — ноль. +* У `BP-A`: e = 120, n = 0 мс, h = 5 мс, a = 10 мс +* `BP-A` шлёт b1 в `t1-10 мс` ⇒ `BP-A-Peer` обрабатывает `h=5 мс`, шлёт в `t-5 мс` ⇒ `BP-B-Peer` обрабатывает `h=5 мс`, шлёт в `t-0 мс` ⇒ приходит в `BP-B` в `t`. +* `BP-A` начинает b2 в `t1-10 мс`, шлёт b2 в `t2-20 мс` ⇒ … приходит в `BP-B` в `t2-10 мс`. +* `BP-A` начинает b3 в `t2-20 мс`, … +* `BP-A` начинает b12 в `t11-110 мс`, шлёт b12 в `t12-120 мс` ⇒ … приходит в `BP-B` в `t12-110 мс` + +## Пример 2: блок приходит на 80 мс раньше +* Нулевая задержка между `BP-A` и `BP-A Peer` и между `BP-B Peer` и `BP-B`. +* 150 мс между `BP-A Peer` и `BP-B Peer`. +* Блоки не упираются в `m`, время выпуска — `w - a`. +* Время подписи — ноль. +* У `BP-A`: e = 240, n = 0/150 мс, h = 5 мс, a = 20 мс +* `BP-A` шлёт b1 в `t1-20 мс` ⇒ … приходит в `BP-B` в `t+140 мс`. +* `BP-A` начинает b2 в `t1-20 мс`, шлёт b2 в `t2-40 мс` ⇒ … приходит в `BP-B` в `t2+120 мс`. +* … +* b12 приходит в `BP-B` в `t12-80 мс` + +## Пример 3: блок опоздал на 16 мс и отброшен +* Нулевая задержка между `BP-A` и `BP-A Peer` и между `BP-B Peer` и `BP-B`. +* 200 мс между `BP-A Peer` и `BP-B Peer`. +* Блоки не упираются в `m`, время выпуска — `w - a`. +* Время подписи — ноль. +* У `BP-A`: e = 204, n = 0/200 мс, h = 10 мс, a = 17 мс +* Цепочка задержек даёт приход b1 в `BP-B` в `t+203 мс`. +* … +* b12 приходит в `BP-B` в `t12+16 мс` — слишком поздно, блок отбрасывается. + +## Пример 4: полные блоки выпускаются раньше +* Нулевая задержка между `BP-A` и `BP-A Peer` и между `BP-B Peer` и `BP-B`. +* 200 мс между `BP-A Peer` и `BP-B Peer`. +* Все блоки полные: в очереди достаточно неприменённых транзакций. +* Блок с транзакциями на 200 мс CPU по времени исполнения собирается за 225 мс (с учётом накладных расходов на выпуск блока). +* У `BP-A`: e = 120, m = 200 мс, n = 0/200 мс, h = 10 мс, a = 10 мс +* `BP-A` шлёт b1 в `t1-275 мс` ⇒ `BP-A-Peer` обрабатывает `h=10 мс`, шлёт в `t-265 мс` =(200 мс)=> `BP-B-Peer` обрабатывает `h=10 мс`, шлёт в `t-55 мс` ⇒ приходит в `BP-B` в `t-55 мс`. +* `BP-A` начинает b2 в `t1-275 мс`, шлёт b2 в `t2-550 мс (t1-50 мс)` ⇒ `BP-A-Peer` обрабатывает `h=10 мс`, шлёт в `t2-540 мс` =(200 мс)=> `BP-B-Peer` обрабатывает `h=10 мс`, шлёт в `t2-330 мс` ⇒ приходит в `BP-B` в `t2-330 мс`. +* `BP-A` начинает b3 в `t2-550 мс`, … +* `BP-A` начинает b12 в `t11-3025 мс`, шлёт b12 в `t12-3300 мс` ⇒ `BP-A-Peer` обрабатывает `h=10 мс`, шлёт в `t12-3290 мс` =(200 мс)=> `BP-B-Peer` обрабатывает `h=10 мс`, шлёт в `t12-3080 мс` ⇒ приходит в `BP-B` в `t12-3080 мс` + +На ретрансляторе с `wasm-runtime=eos-vm-jit` и `eos-vm-oc-enable` время валидации сокращается. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/index.md new file mode 100644 index 000000000..0156cb89c --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/producer_plugin/index.md @@ -0,0 +1,134 @@ + +## Описание + +Плагин `producer_plugin` подключает функции, необходимые узлу для выпуска блоков. + +!!! note + Для выпуска блоков нужна дополнительная настройка: [Настройка производящего узла](../../02_usage/02_node-setups/00_producing-node.md). + +## Использование + +```console +# config.ini +plugin = eosio::producer_plugin [options] +``` +```sh +# параметры запуска nodeos +nodeos ... --plugin eosio::producer_plugin [options] +``` + +## Опции + +Задаются в командной строке `nodeos` и в `config.ini`: + +```console +Config Options for eosio::producer_plugin: + -e [ --enable-stale-production ] Enable block production, even if the + chain is stale. + -x [ --pause-on-startup ] Start this node in a state where + production is paused + --max-transaction-time arg (=499) Setting this value (in milliseconds) + will restrict the allowed transaction + execution time to a value potentially + lower than the on-chain consensus + max_transaction_cpu_usage value. + --max-irreversible-block-age arg (=-1) + Limits the maximum age (in seconds) of + the DPOS Irreversible Block for a chain + this node will produce blocks on (use + negative value to indicate unlimited) + -p [ --producer-name ] arg ID of producer controlled by this node + (e.g. inita; may specify multiple + times) + --signature-provider arg (=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3) + Key=Value pairs in the form + = + Where: + is a string form of + a valid EOS public + key + + is a string in the + form + : + + is KEY, KEOSD, or SE + + KEY: is a string form of + a valid EOS + private key which + maps to the provided + public key + + KEOSD: is the URL where + keosd is available + and the approptiate + wallet(s) are + unlocked + --greylist-account arg account that can not access to extended + CPU/NET virtual resources + --greylist-limit arg (=1000) Limit (between 1 and 1000) on the + multiple that CPU/NET virtual resources + can extend during low usage (only + enforced subjectively; use 1000 to not + enforce any limit) + --produce-block-offset-ms arg (=450) The minimum time to reserve at the end + of a production round for blocks to + propagate to the next block producer. + --max-block-cpu-usage-threshold-us arg (=5000) + Threshold of CPU block production to + consider block full; when within + threshold of max-block-cpu-usage block + can be produced immediately + --max-block-net-usage-threshold-bytes arg (=1024) + Threshold of NET block production to + consider block full; when within + threshold of max-block-net-usage block + can be produced immediately + --subjective-cpu-leeway-us arg (=31000) + Time in microseconds allowed for a + transaction that starts with + insufficient CPU quota to complete and + cover its CPU usage. + --subjective-account-max-failures arg (=3) + Sets the maximum amount of failures + that are allowed for a given account + per block. + --subjective-account-decay-time-minutes arg (=1440) + Sets the time to return full subjective + cpu for accounts + --incoming-transaction-queue-size-mb arg (=1024) + Maximum size (in MiB) of the incoming + transaction queue. Exceeding this value + will subjectively drop transaction with + resource exhaustion. + --disable-subjective-account-billing arg + Account which is excluded from + subjective CPU billing + --disable-subjective-p2p-billing arg (=1) + Disable subjective CPU billing for P2P + transactions + --disable-subjective-api-billing arg (=1) + Disable subjective CPU billing for API + transactions + --snapshots-dir arg (="snapshots") the location of the snapshots directory + (absolute path or relative to + application data dir) +``` + +## Dependencies + +* [`chain_plugin`](../chain_plugin/index.md) + +### Load Dependency Examples + +```console +# config.ini +plugin = eosio::chain_plugin [operations] [options] +``` +```sh +# command-line +nodeos ... --plugin eosio::chain_plugin [operations] [options] +``` + +Подробнее о выпуске блоков — в [пояснении по производству блоков](10_block-producing-explained.md). diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/resource_monitor_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/resource_monitor_plugin/index.md new file mode 100644 index 000000000..f56c9fbc4 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/resource_monitor_plugin/index.md @@ -0,0 +1,52 @@ + +## Обзор + +Плагин `resource_monitor_plugin` следит за заполнением дискового пространства на машине, где работает `nodeos`. Каждые `resource-monitor-interval-seconds` секунд измеряется использование файловых систем, к которым относятся `data-dir`, `state-dir`, `blocks-log-dir`, `snapshots-dir`, `state-history-dir` и `trace-dir`. Если на любом из отслеживаемых томов занято на `5%` меньше порога `resource-monitor-space-threshold`, выводится предупреждение с путём и процентом занятости. Если порог превышен и не задан `resource-monitor-not-shutdown-on-threshold-exceeded`, `nodeos` корректно завершается; если флаг задан, `nodeos` периодически печатает предупреждения, пока занятость не опустится ниже порога. + +`resource_monitor_plugin` всегда загружен. + +## Использование + +```console +# config.ini +plugin = eosio::resource_monitor_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::resource_monitor_plugin [options] +``` + +## Параметры конфигурации + +Задаются в командной строке `nodeos` и в `config.ini`: + +```console +Config Options for eosio::resource_monitor_plugin: + --resource-monitor-interval-seconds arg (=2) + Time in seconds between two consecutive + checks of resource usage. Should be + between 1 and 300 + --resource-monitor-space-threshold arg (=90) + Threshold in terms of percentage of + used space vs total space. If used + space is above (threshold - 5%), a + warning is generated. Unless + resource-monitor-not-shutdown-on-thresh + old-exceeded is enabled, a graceful + shutdown is initiated if used space is + above the threshold. The value should + be between 6 and 99 + --resource-monitor-not-shutdown-on-threshold-exceeded + Used to indicate nodeos will not + shutdown when threshold is exceeded. + --resource-monitor-warning-interval arg (=30) + Number of resource monitor intervals + between two consecutive warnings when + the threshold is hit. Should be between + 1 and 450 +``` + +## Зависимости плагина + +* Нет diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/10_how-to-fast-start-without-old-history.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/10_how-to-fast-start-without-old-history.md new file mode 100644 index 000000000..5adbecbda --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/10_how-to-fast-start-without-old-history.md @@ -0,0 +1,40 @@ +--- +content_title: Быстрый старт без прежней истории +--- + +Эта схема подходит, если нужно **зафиксировать текущее состояние цепочки** и дальше вести **State History** только «вперёд», без полной локальной старой истории. + +## Перед началом + +* [Установлен COOPOS](../../../00_install/index.md). +* Знакомство с [использованием nodeos](../../02_usage/index.md). +* Знакомство с [state_history_plugin](../../03_plugins/state_history_plugin/index.md). + +## Шаги + +1. Подготовьте: + * переносимый снимок (`data/snapshots/snapshot-xxxxxxx.bin`) + * по желанию: `blocks.log`, включающий блок, на котором снят снимок + +2. Убедитесь, что нет каталога `data/state` + +3. Запустите `nodeos` с `--snapshot` и опциями из описания [`state_history_plugin`](index.md). + +4. В логе найдите `Placing initial state in block n` — `n` это номер стартового блока. + +5. Если используете filler БД, запустите его с `--fpg-create` (PostgreSQL), `--fill-skip-to n` и `--fill-trim`. Подставьте `n` из шага 4. + +6. Не останавливайте `nodeos`, пока он не получит хотя бы один блок из сети — иначе перезапуск может быть невозможен. + +## Замечания + +Нет блоков из сети — подключите `net_api_plugin` и переподключите пиры: `cleos net disconnect` / `cleos net connect`. + +!!! warning "Осторожно с `net_api_plugin`" + Закройте файрволом доступ к `http-server-address` или задайте `localhost:8888`, чтобы отключить удалённый доступ. + +!!! note + После этого при перезапуске filler используйте `--fill-trim`. `--fpg-create` и `--fill-skip-to` — только при первом запуске. + +!!! note + На крупных цепочках первая дельта может быть слишком большой для процессов JavaScript; 64-битные C++ процессы справляются. В filler’ах `fill-pg` и `fill-lmdb` большая запись дробится на меньшие при заполнении БД. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/20_how-to-replay-or-resync-with-full-history.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/20_how-to-replay-or-resync-with-full-history.md new file mode 100644 index 000000000..2afc6ef15 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/20_how-to-replay-or-resync-with-full-history.md @@ -0,0 +1,17 @@ +--- +content_title: Реплей или ресинхронизация с полной историей +--- + +Полная история состояния на **nodeos** COOPOS: реплей или догонка с [`state_history_plugin`](index.md) от `blocks.log` или `--genesis-json`, чтобы с нуля записывалась вся цепочка в state history. + +## Перед началом + +* [COOPOS](../../../00_install/index.md), [nodeos](../../02_usage/index.md), [state_history_plugin](../../03_plugins/state_history_plugin/index.md). + +## Шаги + +1. Получите `blocks.log` и положите в `data/blocks`, либо возьмите файл генезиса и укажите `--genesis-json` + +2. Убедитесь, что нет `data/state`, либо используйте `--replay-blockchain` + +3. Запустите `nodeos` с опциями из [`state_history_plugin`](index.md) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/30_how-to-create-snapshot-with-full-history.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/30_how-to-create-snapshot-with-full-history.md new file mode 100644 index 000000000..9ade84823 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/30_how-to-create-snapshot-with-full-history.md @@ -0,0 +1,37 @@ +--- +content_title: Создание снимка с полной историей состояния +--- + +На узле **nodeos** COOPOS, где уже крутится полная state history с генезиса, снимается переносимый snapshot и копируются согласованные файлы `data/state-history` (и при необходимости `blocks.log`) для переноса или бэкапа. + +## Перед началом + +* [COOPOS](../../../00_install/index.md), [nodeos](../../02_usage/index.md), [state_history_plugin](../../03_plugins/state_history_plugin/index.md). + +## Шаги + +1. Включите `producer_api_plugin` на узле с полной state history. + +!!! warning "Осторожно с `producer_api_plugin`" + Закройте файрволом доступ к `http-server-address` или укажите `localhost:8888`. + +2. Создайте переносимый снимок: +```sh +curl http://127.0.0.1:8888/v1/producer/create_snapshot | json_pp +``` + +3. Дождитесь нескольких блоков после завершения снимка: в файлах state history должно быть минимум на один блок больше, чем в переносимом снимке, а в `blocks.log` — блок после того, как он стал необратимым. + +!!! note "Примечание" + Если блок из снимка вытеснен форком, снимок недействителен — повторите процедуру. + +4. Остановите `nodeos`. + +5. Сохраните копии: + * нового переносимого снимка (`data/snapshots/snapshot-xxxxxxx.bin`) + * содержимого `data/state-history`: + * `chain_state_history.log` + * `trace_history.log` + * `chain_state_history.index` — по желанию; без него восстановление дольше + * `trace_history.index` — по желанию; без него восстановление дольше + * по желанию: `data/blocks` без `data/blocks/reversible` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/40_how-to-restore-snapshot-with-full-history.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/40_how-to-restore-snapshot-with-full-history.md new file mode 100644 index 000000000..d160b5176 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/40_how-to-restore-snapshot-with-full-history.md @@ -0,0 +1,29 @@ +--- +content_title: Восстановление снимка с полной историей состояния +--- + +**nodeos** COOPOS поднимается из переносимого снимка вместе с каталогом state history, чтобы снова синхронизироваться с сетью и продолжить отдачу полной истории через [`state_history_plugin`](index.md). + +## Перед началом + +* [COOPOS](../../../00_install/index.md), [nodeos](../../02_usage/index.md), [state_history_plugin](../../03_plugins/state_history_plugin/index.md). + +## Шаги + +1. Подготовьте: + * переносимый снимок (`data/snapshots/snapshot-xxxxxxx.bin`) + * содержимое `data/state-history` + * по желанию: `blocks.log`, покрывающий блок снимка; без `data/blocks/reversible` + +2. Убедитесь, что нет `data/state` + +3. Запустите `nodeos` с `--snapshot` и опциями [`state_history_plugin`](index.md). + +4. Не останавливайте `nodeos`, пока не получите хотя бы один блок из сети. + +## Замечания + +Блоки не идут — `net_api_plugin` и `cleos net disconnect` / `cleos net connect`. + +!!! warning "Осторожно с `net_api_plugin`" + Закройте файрволом доступ к `http-server-address` или укажите `localhost:8888`. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/index.md new file mode 100644 index 000000000..9a783e0fa --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/state_history_plugin/index.md @@ -0,0 +1,59 @@ + +## Описание + +Плагин `state_history_plugin` сохраняет исторические данные о состоянии блокчейна. Получает данные от других узлов и кэширует их в файлах. Слушает сокет для подключения приложений и отдаёт данные согласно опциям, заданным при запуске `nodeos`. + +## Использование + +```console +# config.ini +plugin = eosio::state_history_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::state_history_plugin [operations] [options] +``` + +## Операции (только CLI) + +Только командная строка `nodeos`: + +```console +Command Line Options for eosio::state_history_plugin: + + --delete-state-history clear state history files +``` + +## Опции + +Командная строка `nodeos` и `config.ini`: + +```console +Config Options for eosio::state_history_plugin: + --state-history-dir arg (="state-history") + the location of the state-history + directory (absolute path or relative to + application data dir) + --trace-history enable trace history + --chain-state-history enable chain state history + --state-history-endpoint arg (=127.0.0.1:8080) + the endpoint upon which to listen for + incoming connections. Caution: only + expose this port to your internal + network. + --state-history-unix-socket-path arg the path (relative to data-dir) to + create a unix socket upon which to + listen for incoming connections. + --trace-history-debug-mode enable debug mode for trace history + --state-history-log-retain-blocks arg if set, periodically prune the state + history files to store only configured + number of most recent blocks +``` + +## Практические руководства + +* [Быстрый старт без старой истории на существующих цепочках](10_how-to-fast-start-without-old-history.md) +* [Реплей или ресинхронизация с полной историей](20_how-to-replay-or-resync-with-full-history.md) +* [Переносимый снимок с полной state history](30_how-to-create-snapshot-with-full-history.md) +* [Восстановление переносимого снимка с полной state history](40_how-to-restore-snapshot-with-full-history.md) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/api-reference/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/api-reference/index.md new file mode 100644 index 000000000..65b5b08a9 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/api-reference/index.md @@ -0,0 +1 @@ + diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/index.md new file mode 100644 index 000000000..1b9a30665 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_api_plugin/index.md @@ -0,0 +1,46 @@ + +## Описание + +Плагин `test_control_api_plugin` отправляет управляющее сообщение в [test_control_plugin](../test_control_plugin/index.md), чтобы завершить экземпляр `nodeos` на заданном блоке. Для тестирования. + +## Использование + +```console +# config.ini +plugin = eosio::test_control_api_plugin +``` +```sh +# command-line +nodeos ... --plugin eosio::test_control_api_plugin +``` + +## Опции + +Нет + +## Пример использования + +```sh +curl %s/v1/test_control/kill_node_on_producer -d '{ \"producer\":\"%s\", \"where_in_sequence\":%d, \"based_on_lib\":\"%s\" }' -X POST -H \"Content-Type: application/json\"" % +``` + +## Зависимости + +* [`test_control_plugin`](../test_control_plugin/index.md) +* [`chain_plugin`](../chain_plugin/index.md) +* [`http_plugin`](../http_plugin/index.md) + +### Примеры загрузки зависимостей + +```console +# config.ini +plugin = eosio::chain_plugin +[options] +plugin = eosio::http_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::chain_plugin [operations] [options] \ + --plugin eosio::http_plugin [options] +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_plugin/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_plugin/index.md new file mode 100644 index 000000000..48969a765 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/test_control_plugin/index.md @@ -0,0 +1,37 @@ + +## Описание + +Плагин `test_control_plugin` инициирует корректное завершение при достижении заданного блока в последовательности блоков конкретного продюсера. Можно завершаться по **head block** или по **последнему необратимому блоку**. + +Предназначен для тестов, чтобы точно зафиксировать момент остановки экземпляра `nodeos`. + +## Использование + +```console +# config.ini +plugin = eosio::test_control_plugin +``` +```sh +# command-line +nodeos ... --plugin eosio::test_control_plugin +``` + +## Опции + +Нет + +## Зависимости + +* [`chain_plugin`](../chain_plugin/index.md) + +### Примеры загрузки зависимостей + +```console +# config.ini +plugin = eosio::chain_plugin +[options] +``` +```sh +# command-line +nodeos ... --plugin eosio::chain_plugin [operations] [options] +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/api-reference/index.md b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/api-reference/index.md new file mode 100644 index 000000000..58a6d3f3b --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/api-reference/index.md @@ -0,0 +1 @@ +[Справочник Trace API](https://docs.eosnetwork.com/coopos-plugins/latest/trace.api/) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/clog-format.png b/docs/documentation/blockchain/coopos/01_nodeos/03_plugins/trace_api_plugin/clog-format.png new file mode 100644 index 0000000000000000000000000000000000000000..3631774ba76b3d7eb7a4e585531fd47cbe8031a3 GIT binary patch literal 30112 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 + Where can be: + an absolute path to a file + containing a valid JSON-encoded ABI + a relative path from `data-dir` to a + file containing a valid JSON-encoded + ABI + + --trace-no-abis Use to indicate that the RPC responses + will not use ABIs. + Failure to specify this option when + there are no trace-rpc-abi + configuations will result in an Error. + This option is mutually exclusive with + trace-rpc-api +``` + +## Зависимости + +* [`chain_plugin`](../chain_plugin/index.md) +* [`http_plugin`](../http_plugin/index.md) + +### Примеры загрузки зависимостей + +Если плагины не указаны в CLI или `config.ini`, подключаются со значениями по умолчанию: + +```console +# config.ini +plugin = eosio::chain_plugin +[options] +plugin = eosio::http_plugin +[options] +``` +```sh +# командная строка +nodeos ... --plugin eosio::chain_plugin [options] \ + --plugin eosio::http_plugin [options] +``` + +## Пример конфигурации + +Пример запуска `nodeos` с `trace_api_plugin` для трассировки эталонных контрактов COOPOS: + +```sh +nodeos --data-dir data_dir --config-dir config_dir --trace-dir traces_dir +--plugin eosio::trace_api_plugin +--trace-rpc-abi=eosio=abis/eosio.abi +--trace-rpc-abi=eosio.token=abis/eosio.token.abi +--trace-rpc-abi=eosio.msig=abis/eosio.msig.abi +--trace-rpc-abi=eosio.wrap=abis/eosio.wrap.abi +``` + +## Определения + +Кратко о *слайсах* (slices), содержимом *trace log* и формате *clog*. Это помогает эффективно настраивать опции `trace_api_plugin`. + +### Слайсы + +Для `trace_api_plugin` *slice* — это все релевантные данные трассировки между начальной высотой блока (включительно) и конечной (не включая). Например, слайс 0–10 000 — блоки с номерами ≥ 0 и < 10 000. В каталоге трассировок лежит набор слайсов. Каждый слайс состоит из журнала *trace data* и журнала метаданных *trace index*: + + * `trace_-.log` + * `trace_index_-.log` + +`` и `` — начальный и конечный номер блока слайса, дополненные ведущими нулями до ширины stride. Если старт — 5, конец — 15, stride — 10, то `` = `0000000005`, `` = `0000000015`. + +#### trace_<S>-<E>.log + +Журнал данных трассировки только дописывается; в нём бинарные сериализованные данные блока. Содержимое включает трассировки транзакций и действий для ответов RPC с учётом ABI по действиям. Поддерживаются типы блоков: + + * `block_trace_v0` + * `block_trace_v1` + +В начале — заголовок с версией формата. `block_trace_v0`: ID блока, номер, ID предыдущего, время производства, подписавший продюсер, данные трассировки. `block_trace_v1` добавляет корни Меркла для списков транзакций и действий и счётчик расписания продюсеров с генезиса. + +В журнал могут попадать блоки, вытесненные форком — это нормально. Следующая запись имеет номер на 1 больше предыдущей или тот же/меньше из‑за форка. Каждой записи трассировки соответствует запись в индексном файле слайса. Блоки с форков можно уменьшить, запуская **nodeos** в `read-mode=irreversible`. + +#### trace_index_<S>-<E>.log + +Индексный (метаданные) журнал только дописывается; в нём последовательность бинарно сериализованных типов. Сейчас поддерживаются: + + * `block_entry_v0` + * `lib_entry_v0` + +В начале — заголовок с версией. `block_entry_v0`: ID и номер блока и смещение к записи в журнале данных; по нему находят смещения `block_trace_v0` и `block_trace_v1`. `lib_entry_v0`: последний известный LIB. Модуль чтения использует LIB, чтобы сообщать пользователю статус необратимости. + +### Формат clog + +Сжатые журналы трассировок имеют расширение `.clog` (см. [сжатие журналов](#compression-of-log-files)). Это обобщённый сжатый файл с индексом точек распаковки в конце. Схема: + +![](clog-format.png "clog format") + +Данные сжимаются raw zlib с полными flush *seek points* через равные интервалы. Распаковщик может начать с любой *seek point* без чтения предыдущих данных; проход через seek point внутри потока тоже допустим. + +!!! note "Экономия места под трассировки" + Сжатие может сократить рост каталога трассировок примерно в 20 раз. Например, при 512 seek points на тестовых данных публичной сети EOS рост каталога с полными данными падает с ~50 ГиБ/сут до ~2.5 ГиБ/сут. Из‑за избыточности содержимого сжатие сопоставимо с `gzip -9`. Распакованные данные сразу доступны через [Trace RPC API](api-reference/index.md) без деградации сервиса. + +#### Роль seek points + +При сжатии индекс точек запоминает соответствие смещений в несжатом и сжатом виде, чтобы по несжатому смещению найти ближайшую предшествующую seek point. Это сильно ускоряет позиционирование в конце длинного потока. + +## Автообслуживание + +Цель `trace_api_plugin` — уменьшить ручное обслуживание ФС: автоматически удалять старые журналы трассировок и сжимать их. + +### Удаление журналов + +Для автоматического удаления старых файлов, созданных `trace_api_plugin`: + +```sh + --trace-minimum-irreversible-history-blocks N (=-1) +``` + +Если `N` ≥ 0, на диске остаются только `N` блоков до текущего LIB; файлы соответствующих более старых диапазонов помечаются на удаление. + +### Сжатие журналов {#compression-of-log-files} + +Оптимизация места — отдельная опция: + +```sh + --trace-minimum-uncompressed-irreversible-history-blocks N (=-1) +``` + +При `N` ≥ 0 фоновый поток сжимает необратимые участки журналов; последние `N` необратимых блоков после LIB остаются несжатыми. + +!!! note "Утилита Trace API" + Журналы можно сжимать вручную утилитой [trace_api_util](../../../10_utilities/trace_api_util.md). + +Если опций `trace-minimum-irreversible-history-blocks` и `trace-minimum-uncompressed-irreversible-history-blocks` недостаточно, может понадобиться периодическое ручное обслуживание или внешний планировщик. + +## Ручное обслуживание + +Опция `trace-dir` задаёт каталог файлов трассировки `trace_api_plugin`. После прохождения LIB за пределы слайса файлы стабильны и их можно удалять для освобождения места. Развёрнутая система COOPOS переносит внепроцессное удаление любых файлов в этом каталоге — независимо от того, обращается ли к ним запущенный **nodeos**. Данные, которые формально должны быть доступны, но удалены вручную, дают HTTP 404 на соответствующих endpoint’ах. + +!!! note "Для операторов узлов" + Срок хранения истории на узле можно полностью контролировать через `trace-api-plugin`, опции `trace-minimum-irreversible-history-blocks` и `trace-minimum-uncompressed-irreversible-history-blocks` и внешние менеджеры дискового пространства. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-blocks.log.md b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-blocks.log.md new file mode 100644 index 000000000..f9b68f3b4 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-blocks.log.md @@ -0,0 +1,8 @@ +--- +content_title: Как сформировать файл blocks.log +--- + +В COOPOS **nodeos** пишет необратимые блоки в `blocks.log` под каталогом данных (по умолчанию `data/blocks`) — локальная неизменяемая копия цепочки на этом узле. Другой каталог задаётся `-d` / `--data-dir`. + +!!! note "Другие файлы `blocks.log`" + `blocks.log` можно также получить у сторонних поставщиков. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-snapshot.md b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-snapshot.md new file mode 100644 index 000000000..da8ca9140 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-generate-a-snapshot.md @@ -0,0 +1,17 @@ +--- +content_title: Как создать снимок +--- + +У запущенного **nodeos** COOPOS снимок создаётся вызовом `create_snapshot` у `producer_api_plugin`. Файл попадает в `data/snapshots` относительно `--data-dir`; имя обычно вида `snapshot-.bin`. + +!!! note "Каталог снимков" + Каталог данных задаёт `-d` / `--data-dir`; внутри него — `data/snapshots`. + +Если `nodeos` слушает локально, запрос на создание снимка: + +```sh +curl -X POST http://127.0.0.1:8888/v1/producer/create_snapshot +``` + +!!! note "Журнал блоков отдельно" + Готовый `blocks.log` иногда берут у сторонних поставщиков — для реплея или догонки без полной синхронизации. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-blocks.log.md b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-blocks.log.md new file mode 100644 index 000000000..85657bb93 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-blocks.log.md @@ -0,0 +1,23 @@ +--- +content_title: Как воспроизвести цепочку из blocks.log +--- + +Скопируйте нужный `blocks.log` в `data/blocks`, при необходимости сохраните старые файлы, удалите `blocks.index`, `forkdb.dat`, `shared_memory.bin` и `shared_memory.meta`. + +Каталог | Файл | Действие +----------------------- | ------------------ | ------ +data/blocks | blocks.index | удалить +data/blocks | blocks.log | заменить нужным `blocks.log` +data/blocks/reversible | forkdb.dat | удалить +data/blocks/reversible | shared_memory.bin | удалить +data/blocks/reversible | shared_memory.meta | удалить + +Каталог блоков задаётся в `config.ini` как `blocks-dir = "blocks"` или опцией `--blocks-dir`. + +```sh +nodeos --replay-blockchain \ + --plugin eosio::producer_plugin \ + --plugin eosio::chain_api_plugin \ + --plugin eosio::http_plugin \ + >> nodeos.log 2>&1 & +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-snapshot.md b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-snapshot.md new file mode 100644 index 000000000..02a876856 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/how-to-replay-from-a-snapshot.md @@ -0,0 +1,30 @@ +--- +content_title: Как воспроизвести цепочку из снимка +--- + +Получив валидный файл снимка, скопируйте его в `data/snapshots`, при необходимости сделайте резервную копию и удалите существующее содержимое каталога данных. + +Расположение | Имя | Действие +----------------- | -------------------------- | ------------ +data/snapshots | `.bin` | положить сюда снимок для реплея +data/ | * | удалить + +В `config.ini` можно задать `snapshots-dir = "snapshots"` или использовать `--snapshots-dir` в командной строке; `--snapshot` указывает имя файла снимка для восстановления. + +```sh +nodeos --snapshot yoursnapshot.name \ + --plugin eosio::producer_plugin \ + --plugin eosio::chain_api_plugin \ + --plugin eosio::http_plugin \ + >> nodeos.log 2>&1 & +``` + +При старте со снимка рекомендуется убрать старые данные; если при этом есть `blocks.log`, он *должен* содержать блоки как минимум до блока снимка и *может* содержать последующие блоки — они применятся при запуске. Если `blocks.log` есть, но не покрывает блок снимка или последующие блоки неконсистентны, при реплее со снимка будет исключение. Также применяются доступные обратимые блоки. + +blocks.log | снимок | результат +------------------------ | --------------------------- | ------ +нет | для необратимого блока 2000 | ок +блоки 1–1999 | для необратимого блока 2000 | исключение +блоки 1–2001 | для необратимого блока 2000 | ок — состояние из снимка и применение блока 2001 + +При подъёме узла из снимка нельзя передавать `nodeos` аргументы `--genesis-json` или `--genesis-timestamp` — генезис берётся из снимка. Если `blocks.log` уже есть, его генезис сверяется с данными снимка; при несовпадении реплей завершится ошибкой (проверка, что журнал и снимок относятся к одной цепочке). diff --git a/docs/documentation/blockchain/coopos/01_nodeos/04_replays/index.md b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/index.md new file mode 100644 index 000000000..c9280d763 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/04_replays/index.md @@ -0,0 +1,51 @@ +--- +content_title: Реплеи nodeos +--- + +У `nodeos` есть варианты воспроизведения блоков цепочки. Это полезно, например, если узел скачал `blocks.log` (быстрее, чем полная синхронизация по P2P) и нужно догнать сеть, или если нужно состояние цепочки в конкретные моменты времени. + +Воспроизведение возможно двумя способами: + +- Из файла **`blocks.log`**: +В `blocks.log` хранятся все необратимые транзакции. Каждый `nodeos` дописывает необратимые блоки в `blocks.log` в каталоге `data/blocks` относительно данных `nodeos`. Реплей по `blocks.log` пересоздаёт локально всю историю без лишней нагрузки на сеть. + +- Из **файла снимка (snapshot)**: +Снимок создаётся с работающего `nodeos` и содержит состояние цепочки на блоке, с которого он снят. Рекомендуется использовать снимки с необратимых блоков. Реплей со снимка быстро поднимает `nodeos` с корректным состоянием на заданном номере блока, но без полной истории транзакций до этого блока. Далее узел работает в обычном режиме. + +## Практические инструкции + +* [Как сформировать журнал блоков](how-to-generate-a-blocks.log.md) +* [Как создать снимок](how-to-generate-a-snapshot.md) +* [Как воспроизвести цепочку из журнала блоков](how-to-replay-from-a-blocks.log.md) +* [Как воспроизвести цепочку из снимка](../04_replays/how-to-replay-from-a-snapshot.md) + +## Опции, связанные со снимками и реплеем + +Команда `nodeos --help` выводит все опции. Касающиеся снимков и реплея: + + - **`--force-all-checks`** +Если источник `blocks.log` не доверен, при первом реплее можно запустить `nodeos` с `--replay-blockchain --force-all-checks`, чтобы не пропускать проверки блоков. + + - **`--disable-replay-opts`** +По умолчанию при реплее `nodeos` не строит стек дельт состояния (он нужен для отката состояния по обратимым блокам) — это ускоряет реплей. Данная опция отключает эту оптимизацию. Для `state_history_plugin` она обязательна. + + - **`--replay-blockchain`** +Очистить состояние цепочки и воспроизвести все блоки из `blocks.log` в каталоге `data/blocks`. + + - **`--hard-replay-blockchain`** +Сделать резервную копию текущего `blocks.log`, очистить состояние и воспроизвести блоки из журнала. Предполагается, что в резервной копии `blocks.log` могут быть повреждённые блоки: `nodeos` воспроизводит максимум возможного из резервной копи, а при первом повреждённом блоке досинхронизируется по P2P. + + - **`--delete-all-blocks`** +Очистить локальное состояние цепочки и локальный `blocks.log`. Для последующей синхронизации по P2P нужен корректный `genesis.json`. Опция не рекомендуется. + + - **`--truncate-at-block`** +Аргумент по умолчанию `=0`; если задан ненулевой, при реплее воспроизведение останавливается на указанном номере блока. Работает только вместе с `--hard-replay-blockchain`. Локальный процесс `nodeos` будет иметь состояние на этом блоке. Удобно для проверок в тестах; для узла, синхронизированного с сетью, не предназначено. + + - **`--snapshot`** +Путь к файлу снимка для восстановления состояния без реплея `blocks.log`. Полной истории транзакций до снимка у экземпляра `nodeos` не будет. + + - **`--snapshots-dir`** +Каталог файлов снимков (абсолютный путь или относительно каталога данных приложения). + + - **`--blocks-dir`** +Каталог с `blocks.log` (абсолютный путь или относительно каталога данных приложения). diff --git a/docs/documentation/blockchain/coopos/01_nodeos/05_rpc_apis/index.md b/docs/documentation/blockchain/coopos/01_nodeos/05_rpc_apis/index.md new file mode 100644 index 000000000..b587cca80 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/05_rpc_apis/index.md @@ -0,0 +1,11 @@ +--- +content_title: Удалённые вызовы (RPC API) +link_text: RPC API +--- + +* [Справочник Chain API](../03_plugins/chain_api_plugin/api-reference/index.md) +* [Справочник DB Size API](../03_plugins/db_size_api_plugin/api-reference/index.md) +* [Справочник Net API](../03_plugins/net_api_plugin/api-reference/index.md) +* [Справочник Producer API](../03_plugins/producer_api_plugin/api-reference/index.md) +* [Справочник Test Control API](../03_plugins/test_control_api_plugin/api-reference/index.md) +* [Справочник Trace API](../03_plugins/trace_api_plugin/api-reference/index.md) diff --git a/docs/documentation/blockchain/coopos/01_nodeos/06_logging/00_setup-logging.json.md b/docs/documentation/blockchain/coopos/01_nodeos/06_logging/00_setup-logging.json.md new file mode 100644 index 000000000..32b2cf1ef --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/06_logging/00_setup-logging.json.md @@ -0,0 +1,16 @@ +--- +content_title: Настройка logging.json +--- + +Файл `logging.json` обычно лежит в каталоге `--config-dir` рядом с `config.ini`. Явный путь задаётся опциями `-l` или `--logconf` при запуске `nodeos`. + +```sh +nodeos --help +``` +```console +... +Application Command Line Options: +... +--config-dir arg Directory containing configuration files such as config.ini +-l [ --logconf ] arg (=logging.json) Logging configuration file name/path for library users +``` diff --git a/docs/documentation/blockchain/coopos/01_nodeos/06_logging/01_logging-levels.md b/docs/documentation/blockchain/coopos/01_nodeos/06_logging/01_logging-levels.md new file mode 100644 index 000000000..cd95c7d68 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/06_logging/01_logging-levels.md @@ -0,0 +1,87 @@ +--- +content_title: Уровни логирования +--- + +Доступны шесть уровней: +- all +- debug +- info +- warn +- error +- off + +Пример `logging.json`: + +``` +{ + "includes": [], + "appenders": [{ + "name": "consoleout", + "type": "console", + "args": { + "stream": "std_out", + "level_colors": [{ + "level": "debug", + "color": "green" + },{ + "level": "warn", + "color": "brown" + },{ + "level": "error", + "color": "red" + } + ] + }, + "enabled": true + },{ + "name": "net", + "type": "gelf", + "args": { + "endpoint": "10.10.10.10", + "host": "test" + }, + "enabled": true + } + ], + "loggers": [{ + "name": "default", + "level": "info", + "enabled": true, + "additivity": false, + "appenders": [ + "consoleout", + "net" + ] + },{ + "name": "net_plugin_impl", + "level": "debug", + "enabled": true, + "additivity": false, + "appenders": [ + "net" + ] + } + ] +} +``` + +## Смысл уровней + +* `error` — события, вероятно требующие вмешательства оператора. + - Уровень `error` стоит оставлять для неожиданных ситуаций или тех, где нужен человек. + - Также для явных ошибок ПО: невозможные значения перечислений, выход за границы массива, нулевые указатели и т.п., часто ведущие к исключению. + - *Замечание*: сейчас много сообщений с уровнем `error` логичнее отнести к `warn` — например, в `net_plugin_impl` для плохих сетевых соединений, которые обрабатываются штатно; такие случаи лучше перевести на `warn` или `info`. +* `warn` — неожиданное, но восстановимое. + - Обычно не требует немедленного вмешательства, но частые `warn` могут сигнализировать о действиях оператора. + - `warn` не стоит использовать просто как «информацию» — это сигнал обратить внимание, без обязательной тревоги. +* `info` (по умолчанию) — полезная оператору информация. + - Прогресс и полезные данные; стараются не засыпать логом: например, не логировать каждую транзакцию на `info`. + - Для прогресса логируют через интервалы, например каждые 1000 транзакций. +* `debug` — детали при включённом нетипичном логировании. + - Вопрос: полезно ли это оператору, смотрящему лог. Объём как у `info`: не раздувать. + - Включение `debug` должно прояснять поведение без лавины строк. + - `debug` не заменяет трассировку; для неё — `all` (см. ниже). + - Как и для `info`, не логировать каждую транзакцию на `debug`; для транзакций есть отдельные логгеры: `transaction`, `transaction_trace_failure`, `transaction_trace_success`, `transaction_failure_tracing`, `transaction_success_tracing`, `transient_trx_success_tracing`, `transient_trx_failure_tracing`. +* `all` (trace) — то, что при `debug` засыпало бы лог. + - Трассировочный уровень; поддержан частично. + - *Замечание*: в будущем другая библиотека логирования может дать лучшую трассировку; текущая среда не рассчитана на огромный объём trace-вывода. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/06_logging/index.md b/docs/documentation/blockchain/coopos/01_nodeos/06_logging/index.md new file mode 100644 index 000000000..3ebeb5794 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/06_logging/index.md @@ -0,0 +1,110 @@ +--- +content_title: Логирование nodeos +--- + +Логирование `nodeos` задаётся файлом `logging.json`. Опции CLI при запуске `nodeos` позволяют [настроить `logging.json`](00_setup-logging.json.md). В конфигурации задаются [аппендеры](#appenders), привязка к [логгерам](#loggers) и [уровни логирования](01_logging-levels.md). + +## Аппендеры {#appenders} + +Встроенная библиотека логирования COOPOS поддерживает два типа аппендеров: + +- [Консоль](#console) +- [GELF](#gelf) (Graylog Extended Log Format) + +### Консоль {#console} + +Вывод сообщений на экран. Параметры: + +- `name` — произвольное имя для ссылок из логгеров +- `type` — `"console"` +- `stream` — `"std_out"` или `"std_err"` +- `level_colors` — сопоставление уровня логирования цвету + - level — см. [уровни логирования](01_logging-levels.md) + - color — одно из: `"red"`, `"green"`, `"brown"`, `"blue"`, `"magenta"`, `"cyan"`, `"white"`, `"console_default"` +- `enabled` — включить/выключить аппендер + +Пример: + +```json +{ + "name": "consoleout", + "type": "console", + "args": { + "stream": "std_out", + + "level_colors": [{ + "level": "debug", + "color": "green" + },{ + "level": "warn", + "color": "brown" + },{ + "level": "error", + "color": "red" + } + ] + }, + "enabled": true +} +``` + +### GELF {#gelf} + +Отправка сообщений в Graylog — платформу сбора, индексации и анализа логов. Параметры: + + - `name` — произвольное имя для ссылок из логгеров + - `type` — `"gelf"` + - `endpoint` — IP-адрес и порт + - `host` — имя хоста в Graylog, идентификатор источника + - `enabled` — включить/выключить аппендер + +Пример: + +```json +{ + "name": "net", + "type": "gelf", + "args": { + "endpoint": "104.198.210.18:12202”, + "host": + }, + "enabled": true +} +``` + +## Логгеры {#loggers} + +Поддерживаются такие логгеры: + +- `default` — логгер по умолчанию, всегда включён +- `net_plugin_impl` — подробный лог сетевого плагина +- `http_plugin` — подробный лог HTTP-плагина +- `producer_plugin` — подробный лог плагина продюсера +- `transaction_tracing` — подробный лог вердиктов ретрансляторов в P2P +- `transaction_failure_tracing` — подробный лог неуспешных вердиктов в P2P +- `trace_api` — подробный лог плагина trace_api + +Параметры: + + - `name` — должно совпадать с одним из имён выше + - `level` — см. уровни ниже + - `enabled` — включить/выключить логгер + - `additivity` — `true` или `false` + - `appenders` — список имён аппендеров из конфигурации аппендеров + +Пример: + +```json +{ + "name": "net_plugin_impl", + "level": "debug", + "enabled": true, + "additivity": false, + "appenders": [ + "net" + ] +} +``` + +!!! note + Если `logging.json` нет, у всех логгеров по умолчанию уровень `info`. В `logging.json` каждый логгер настраивается отдельно. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/05_storage-and-read-modes.md b/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/05_storage-and-read-modes.md new file mode 100644 index 000000000..706cd2d4e --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/05_storage-and-read-modes.md @@ -0,0 +1,60 @@ +--- +content_title: Хранилище и режимы чтения +--- + +Платформа COOPOS хранит данные блокчейна в разных структурах на этапах жизненного цикла транзакции. Ниже — часть из них. Производящий узел — это экземпляр `nodeos` у того продюсера, который сейчас создаёт блоки (роль меняется примерно каждые 6 секунд: 12 блоков подряд, затем другой продюсер.) + +## Состояние блокчейна и хранение + +Каждый `nodeos` создаёт внутренние файлы для учёта состояния цепочки. Они лежат в каталоге установки `~/eosio/nodeos/data`; назначение: + +* `blocks.log` — только дописываемый журнал необратимых блоков с финальными подтверждёнными транзакциями. +* `reversible_blocks` — memory-mapped файл с блоками, уже записанными в цепочку, но ещё не необратимыми; в них — валидные транзакции, ожидающие финализации по консенсусу. Head block — последний записанный блок, хранится в `reversible_blocks`. +* `chain state` / `chain database` — в memory-mapped файле кэшируется состояние цепочки по блокам: аккаунты, отложенные транзакции, данные multi_index смарт-контрактов. Кэшируются ID последних 65 536 блоков для TaPOS. ID транзакции и срок действия кэшируются до истечения транзакции. + +* `pending block` — блок в памяти с транзакциями по мере обработки; он станет или может стать head block. Если этот `nodeos` — производящий узел, pending block рассылается другим экземплярам `nodeos`. +* Вне состояния цепочки данные блоков кэшируются в RAM до необратимости; кэшируется в том числе подписанный блок. Когда LIB догоняет блок, блок читается из журнала необратимых блоков. + +## Интерфейсы COOPOS + +COOPOS даёт [сервисы](../../) и [интерфейсы](https://docs.eosnetwork.com/cdt/latest/reference/Files/), чтобы контракты сохраняли состояние между действиями и транзакциями. Например, контракт `eosio.token` хранит балансы в базе состояния цепочки. Каждый `nodeos` держит БД в памяти, поэтому чтение/запись в контрактах просты. + +### HTTP RPC API nodeos + +Через HTTP [RPC API](../05_rpc_apis/index.md) сервис `nodeos` отдаёт запросы к базе состояния цепочки. + +## Режимы чтения nodeos + +`nodeos` можно запускать в разных режимах «чтения». Они влияют на обработку блоков и транзакций: + +- `head`: учитываются только побочные эффекты подтверждённых транзакций; необработанные транзакции обрабатываются, но в состояние не включаются. +- `irreversible`: только подтверждённые транзакции до последнего необратимого блока включительно. +- `speculative`: побочные эффекты подтверждённых и неподтверждённых транзакций. + +Транзакция считается подтверждённой, когда `nodeos` принял её, обработал и записал в блок цепочки — она в head block или раньше. + +### Режим head + +Клиенты (`cleos`, RPC API) видят состояние БД на текущий head block. Head ещё не необратим, возможны короткие форки — при переключении на лучшую ветку прочитанное состояние может устареть. + +В этом режиме `nodeos` может выполнять транзакции с TaPoS, указывающим на любой валидный блок в лучшей по мнению узла ветке. + +### Режим irreversible + +`nodeos` по-прежнему отслеживает актуальные блоки в fork database, но отображаемое состояние отстаёт от «головы» форка (fork DB head) и соответствует последнему необратимому блоку. + +Клиенты (`cleos`, RPC API) видят состояние БД по последнему необратимому блоку и **не** включают изменения от транзакций, известных узлу, но ещё не попавших в цепочку (в т.ч. неподтверждённых). + +### Режим speculative (устарел) + +Клиенты видят состояние head block плюс изменения от всех известных узлу транзакций, которые могут ещё не попасть в цепочку. + +Низкая задержка, но хрупко: нет гарантии, что эти транзакции попадут в цепочку или в том же порядке, что подразумевает видимое состояние. + +Минимальная задержка при максимальной непоследовательности. + +В speculative режиме `nodeos` может выполнять транзакции с TaPoS на любой валидный блок лучшей ветки. + +## Как задать режим чтения + +Режим задаётся опцией `--read-mode` плагина `eosio::chain_plugin`. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/10_context-free-data/index.md b/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/10_context-free-data/index.md new file mode 100644 index 000000000..a922c8d64 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/10_context-free-data/index.md @@ -0,0 +1,16 @@ +--- +content_title: Контекстно-свободные данные (CFD) +link_text: Контекстно-свободные данные +--- + +## Обзор +Неизменяемость блокчейна защищает данные и их целостность, но усложняет удаление несущественной информации. В транзакциях COOPOS есть отдельная секция — *context-free data*. Как следует из названия, эти данные не привязаны к предыдущему контексту и зависимостям, поэтому их теоретически можно удалять безопаснее. Удаление не должно ломать целостность цепочки. + +## Идея +Контекстно-свободные данные позволяют приложениям хранить в транзакции необязательную информацию. Примеры: + +* Вторичные или кратковременные данные цепочки +* Краткосрочная некритичная информация к сообщению транзакции +* Комментарии пользователей к статье в блокчейне + +В общем случае сюда относится всё, что не критично для работы и целостности цепочки. Также CFD можно использовать для соблюдения требований законодательства о персональных данных. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/index.md b/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/index.md new file mode 100644 index 000000000..6b4ce1cee --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/07_concepts/index.md @@ -0,0 +1,8 @@ +--- +content_title: Концепции nodeos +--- + +Раздел с пояснениями по `nodeos`, практиками и деталями реализации. + +* [Хранилище и режимы чтения](05_storage-and-read-modes.md) — состояние блокчейна, хранение, режимы чтения `nodeos`. +* [Context-free data](10_context-free-data/index.md) — цели, плюсы и операции с контекстно-свободными данными. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/08_troubleshooting/index.md b/docs/documentation/blockchain/coopos/01_nodeos/08_troubleshooting/index.md new file mode 100644 index 000000000..68a783099 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/08_troubleshooting/index.md @@ -0,0 +1,47 @@ +--- +content_title: Устранение неполадок nodeos +--- + +### «Database dirty flag set (likely due to unclean shutdown): replay required» + +`nodeos` нужно останавливать корректно: отправьте `SIGTERM`, `SIGQUIT` или `SIGINT` и дождитесь завершения. Иначе возможна эта ошибка. Тогда остаётся реплей: запуск `nodeos` с `--replay-blockchain`. + +### Ошибка «Memory does not match data» при перезапуске + +При сообщении вроде `St9exception: content of memory does not match data expected by executable` попробуйте запустить `nodeos` с одной из опций (полный список — `nodeos --help`): + +``` +Command Line Options for eosio::chain_plugin: + --force-all-checks do not skip any checks that can be + skipped while replaying irreversible + blocks + --replay-blockchain clear chain state database and replay + all blocks + --hard-replay-blockchain clear chain state database, recover as + many blocks as possible from the block + log, and then replay those blocks + --delete-all-blocks clear chain state database and block + log +``` + +### Ошибка «Could not grow database file to requested size.» + +Запустите `nodeos` с `--shared-memory-size-mb 1024`. Файл shared memory ~1 ГБ позволяет порядка полумиллиона транзакций. + +### Какая версия COOPOS запущена / к какой версии подключаюсь? + +При настройках по умолчанию `cleos get info` покажет поле `server_version`. Если `nodeos` не на дефолтном URL, укажите адрес: + +```sh +cleos --url http://localhost:8888 get info +``` + +Только строка версии: + +```sh +cleos --url http://localhost:8888 get info | grep server_version +``` + +### Ошибка 3070000: WASM Exception + +При развёртывании `eosio.bios` или `eosio.system` для загрузки цепочки на базе COOPOS и ошибке вроде `Publishing contract... Error 3070000: WASM Exception Error Details: env.set_proposed_producers_ex unresolveable` нужно сначала активировать протокольную функцию `PREACTIVATE_FEATURE`. diff --git a/docs/documentation/blockchain/coopos/01_nodeos/index.md b/docs/documentation/blockchain/coopos/01_nodeos/index.md new file mode 100644 index 000000000..99d553151 --- /dev/null +++ b/docs/documentation/blockchain/coopos/01_nodeos/index.md @@ -0,0 +1,29 @@ +--- +content_title: nodeos +--- + +!!! note "Сеть COOPOS" + **nodeos** — демон узла COOPOS. Ресурсы сети и системный контракт (в т. ч. для **cleos**): [справка](../system-resources.md). + +## Введение + +`nodeos` — основной сервисный демон на каждом узле COOPOS. Его можно настроить на обработку смарт-контрактов, проверку транзакций, выпуск блоков с валидными транзакциями и финализацию блоков для записи в цепочку. + +## Установка + +`nodeos` входит в [репозиторий COOPOS](https://github.com/coopenomics/coopos). Раздел установки: [Установка ПО COOPOS](../00_install/index.md). + +## Навигация + +Ниже — разделы по настройке и использованию `nodeos`. + +* [Использование](02_usage/index.md) — конфигурация и запуск `nodeos`, типовые схемы узлов и среды разработки. +* [Плагины](03_plugins/index.md) — плагины, опции, обязательные и необязательные. +* [Реплеи](04_replays/index.md) — воспроизведение цепочки из снимка или файла `blocks.log`. +* [RPC API](05_rpc_apis/index.md) — справка по HTTP RPC для плагинов. +* [Логирование](06_logging/index.md) — `logging.json`, логгеры, аппендеры, уровни. +* [Концепции](07_concepts/index.md) — пояснения и детали реализации `nodeos`. +* [Устранение неполадок](08_troubleshooting/index.md) — типичные проблемы `nodeos`. + +!!! note "Узел доступа" + Клиентскому приложению или смарт-контракту нужен локальный или удалённый узел COOPOS с запущенным `nodeos`. diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-buy-ram.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-buy-ram.md new file mode 100644 index 000000000..c44eadd76 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-buy-ram.md @@ -0,0 +1,23 @@ +## Обзор + +Здесь показано, как купить RAM на аккаунт через `cleos system buyram` — чтобы хватило квоты на развёртывание контракта, таблицы состояния и рост данных на цепи. + +## Перед началом + +* У вас есть аккаунт. + +* Развёрнуты и используются эталонные системные контракты из репозитория `eosio.contracts` для управления системными ресурсами. + +* На аккаунте достаточно токенов. + +* Установлена поддерживаемая версия `cleos`. + +* Разблокируйте кошелёк. + +## Шаги + +Купить RAM на сумму 0.1 SYS для аккаунта `alice`: + +```sh +cleos system buyram alice alice "0.1 SYS" -p alice@active +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-config-a-multisig-account.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-config-a-multisig-account.md new file mode 100644 index 000000000..578e2c37a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-config-a-multisig-account.md @@ -0,0 +1,20 @@ +## Обзор + +На этой странице показан пример настройки разрешения `active` аккаунта так, чтобы для действий требовались подписи нескольких аккаунтов (порог и веса в `authority`). Это основа для мультиподписи при работе через `cleos`. + +## Перед началом + +* У вас есть аккаунт. + +* Выделено достаточно ресурсов для выполнения транзакции. + +* Установлена поддерживаемая версия `cleos`. + +* Нужны базовые понятия: [аккаунт и разрешения](../../../accounts.md) и [транзакции](../../../transactions.md). + + +## Шаги + +```sh +cleos set account permission multisig active '{\"threshold\" : 1, \"accounts\" :[{\"permission\":{\"actor\":\"eosio\",\"permission\":\"active\"},\"weight\":1},{\"permission\":{\"actor\":\"customera\",\"permission\":\"active\"},\"weight\":1}]}' owner -p multisig@owner" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-connect-a-specific-network.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-connect-a-specific-network.md new file mode 100644 index 000000000..ea47b9ece --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-connect-a-specific-network.md @@ -0,0 +1,23 @@ +## Обзор + +На этой странице показано, как направить `cleos` на конкретный хост `nodeos` или `keosd`, чтобы выполнить нужную команду против удалённого или нестандартного API. Для этого используются необязательные аргументы `--url` и `--wallet-url` с HTTP-адресом и портом сервиса. + +!!! note "Адрес и порт по умолчанию" + Если необязательные аргументы не заданы (т.е. без `--url` или `--wallet-url`), `cleos` пытается подключиться к локальным `nodeos` или `keosd` на `127.0.0.1` и порту по умолчанию `8888`. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +## Шаги +### Подключение к nodeos + +```sh +cleos -url http://nodeos-host:8888 COMMAND +``` + +### Подключение к keosd + +```sh +cleos --wallet-url http://keosd-host:8888 COMMAND +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-a-wallet.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-a-wallet.md new file mode 100644 index 000000000..6fda0d234 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-a-wallet.md @@ -0,0 +1,58 @@ +## Обзор + +Здесь описано, как создать кошелёк `keosd` через `cleos wallet create` и сохранить пароль в файл — чтобы затем импортировать ключи и подписывать транзакции из CLI. + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Ознакомьтесь с командой [`cleos wallet create`](../03_command-reference/wallet/create.md) и её параметрами. +* Ознакомьтесь с остальными командами [`cleos wallet`](../03_command-reference/wallet/index.md). +* Установлена поддерживаемая версия `cleos`. + +!!! note "Примечание" + `cleos` входит в состав ПО COOPOS. При [установке COOPOS](../../00_install/index.md) устанавливается и `cleos`. + +* Нужны базовые понятия: [аккаунт](../../../accounts.md), [аккаунты и разрешения](../../../accounts.md) и пара открытого/закрытого ключа в этой модели. + +## Шаги + +Выполните шаг ниже. + +Создайте кошелёк по умолчанию или с именем и сохраните пароль кошелька в файл: + +```sh +cleos wallet create [-n named_wallet] -f +``` + +Здесь `file_to_save_pwd` — имя файла, в который записывается пароль кошелька, а `named_wallet` — необязательный параметр для имени кошелька. + +Ниже приведены примеры. + +* Создать кошелёк по умолчанию и сохранить пароль в файл `default_wallet.pwd`: + +**Пример вывода** + +```sh +cleos wallet create -f default_wallet.pwd +``` +```console +Creating wallet: default +Save password to use in the future to unlock this wallet. +Without password imported keys will not be retrievable. +saving password to default_wallet.pwd +``` + +* Создать именованный кошелёк `my_wallet` и сохранить пароль в файл `my_wallet.pwd`: + +**Пример вывода** + +```sh +cleos wallet create -n my_wallet -f my_wallet.pwd +``` +```console +Creating wallet: my_wallet +Save password to use in the future to unlock this wallet. +Without password imported keys will not be retrievable. +saving password to my_wallet.pwd +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-an-account.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-an-account.md new file mode 100644 index 000000000..5a7467d75 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-an-account.md @@ -0,0 +1,53 @@ +## Обзор + +В этом руководстве описано, как создать новый аккаунт блокчейна COOPOS с помощью CLI `cleos`. Аккаунты нужны для развёртывания смарт-контрактов и других операций в блокчейне. Создайте один или несколько аккаунтов при настройке среды разработки. + +В примере создаётся аккаунт **bob**, авторизованный системным аккаунтом по умолчанию **eosio**, через `cleos`. + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Установлена поддерживаемая версия `cleos`. +* Изучите раздел [Аккаунты и разрешения](../../../accounts.md). +* Нужны базовые понятия: пара открытого и закрытого ключа в той же модели (см. [аккаунты](../../../accounts.md)). +* Создайте пары открытого/закрытого ключа для разрешений `owner` и `active` аккаунта. + +!!! note "Состав COOPOS" + `cleos` входит в пакет COOPOS; при [установке из исходников](../../00_install/index.md) ставится вместе с `nodeos` и `keosd`. + +## Справка по командам + +См. справку по использованию `cleos` и опциям: + +* команда [`cleos create account`](../03_command-reference/create/account.md) и её параметры + +## Процедура + +Ниже показано, как создать аккаунт **bob**, авторизованный системным аккаунтом **eosio**. + +1. Выполните команду для создания аккаунта **bob**: + +```sh +cleos create account eosio bob EOS87TQktA5RVse2EguhztfQVEh6XXxBmgkU8b4Y5YnGvtYAoLGNN +``` +**Где**: + +* `eosio` — системный аккаунт, авторизующий создание нового аккаунта +* `bob` — имя нового аккаунта в соответствии с [правилами имён и разрешений](../../../accounts.md) +* `EOS87TQ...AoLGNN` — открытый ключ владельца или уровень разрешения для нового аккаунта (**обязательно**) + +!!! note "Кто может создать аккаунт" + Нужен уже существующий аккаунт-создатель с правом вызвать `newaccount`. В чистой тестовой сети для этого обычно используют системный аккаунт **eosio**. В продуктовой сети COOPOS создание новых аккаунтов идёт по правилам регистратора — см. [ресурсы и регистрация](../../../system-resources.md). + +**Пример вывода** + +```console +executed transaction: 4d65a274de9f809f9926b74c3c54aadc0947020bcfb6dd96043d1bcd9c46604c 200 bytes 166 us +# eosio <= eosio::newaccount {"creator":"eosio","name":"bob","owner":{"threshold":1,"keys":[{"key":"EOS87TQktA5RVse2EguhztfQVEh6X... +warning: transaction executed locally, but may not be confirmed by the network yet ] +``` + +### Итог + +Следуя этим шагам, вы создаёте новый аккаунт COOPOS в своей среде. diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-key-pairs.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-key-pairs.md new file mode 100644 index 000000000..b92944240 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-create-key-pairs.md @@ -0,0 +1,70 @@ +## Обзор + +В этом руководстве описано, как создать пару ключей (открытый и закрытый) для подписи транзакций в блокчейне COOPOS. + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Установлена поддерживаемая версия `cleos`. +* Нужны базовые понятия: асимметричная криптография (пара открытого и закрытого ключа) в модели аккаунтов COOPOS; см. также [аккаунты и разрешения](../../../accounts.md). + +!!! note "Состав COOPOS" + Утилита `cleos` входит в пакет COOPOS: при [установке из исходников](../../00_install/index.md) она собирается вместе с `nodeos` и `keosd`. + +## Справка по командам + +См. справку по использованию `cleos` и опциям: + +* команда [`cleos create key`](../03_command-reference/create/key.md) и её параметры + +## Процедура + +Ниже показано, как создать пару открытого/закрытого ключа, вывести её в консоль и сохранить в файл: + +1. Создайте пару и выведите её в консоль: + +```sh +cleos create key --to-console +``` + +**Где**: + +* `--to-console` — опция для вывода пары ключей в консоль + +**Пример вывода** + +```console +Private key: 5KPzrqNMJdr6AX6abKg*******************************cH +Public key: EOS4wSiQ2jbYGrqiiKCm8oWR88NYoqnmK4nNL1RCtSQeSFkGtqsNc +``` + +2. Создайте пару и сохраните её в файл: + +```sh +cleos create key --file pw.txt +``` +**Где**: + +* `--file` — опция для сохранения пары ключей в файл +* `FILE_TO_SAVEKEY` — имя файла для сохранения пары ключей + +**Пример вывода** + +```console +saving keys to pw.txt +``` + +Чтобы посмотреть сохранённую пару в файле: + +```sh +cat pw.txt +``` +```console +Private key: 5K7************************************************ +Public key: EOS71k3WdpLDeqeyqVRAAxwpz6TqXwDo9Brik5dQhdvvpeTKdNT59 +``` + +## Итог + +Следуя этим шагам, вы создаёте пары открытого/закрытого ключа, выводите их в консоль и сохраняете в файл. diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-CPU-resource.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-CPU-resource.md new file mode 100644 index 000000000..28bb70429 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-CPU-resource.md @@ -0,0 +1,45 @@ +## Обзор + +Здесь показано, как делегировать пропускную способность CPU с одного аккаунта на другой через `cleos system delegatebw` — чтобы выделить CPU получателю (при необходимости в той же транзакции можно указать и NET). + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Ознакомьтесь с командой [`cleos system delegatebw`](../03_command-reference/system/system-delegatebw.md) и её параметрами. +* Установлена поддерживаемая версия `cleos`. + +!!! note "Примечание" + `cleos` входит в состав ПО COOPOS. При [установке COOPOS](../../00_install/index.md) устанавливается и `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория [`reference-contracts`](https://github.com/Coopenomics/reference-contracts) для управления системными ресурсами. +* Нужны базовые понятия: [аккаунт](../../../accounts.md) и [системные ресурсы NET/CPU](../../../system-resources.md) в COOPOS. + +## Шаги + +Выполните шаг ниже. + +Делегируйте пропускную способность CPU с исходного аккаунта на аккаунт-получатель: + +```sh +cleos system delegatebw +``` + +Здесь `from` — аккаунт, с которого делегируется пропускная способность, `receiver` — аккаунт-получатель, а `stake_net_quantity` и/или `stake_cpu_quantity` — объём токенов в стейке для NET и/или CPU соответственно. + +Ниже приведены примеры. + +* Делегировать 0.01 SYS на пропускную способность CPU от `bob` к `alice`: + +**Пример вывода** + +```sh +cleos system delegatebw bob alice "0 SYS" "0.01 SYS" +``` +```json +executed transaction: 5487afafd67bf459a20fcc2dbc5d0c2f0d1f10e33123eaaa07088046fd18e3ae 192 bytes 503 us +# eosio <= eosio::delegatebw {"from":"bob","receiver":"alice","stake_net_quantity":"0.0000 SYS","stake_cpu_quantity":"0.0100 SYS"... +# eosio.token <= eosio.token::transfer {"from":"bob","to":"eosio.stake","quantity":"0.0010 SYS","memo":"stake bandwidth"} +# bob <= eosio.token::transfer {"from":"bob","to":"eosio.stake","quantity":"0.0010 SYS","memo":"stake bandwidth"} +# eosio.stake <= eosio.token::transfer {"from":"bob","to":"eosio.stake","quantity":"0.0010 SYS","memo":"stake bandwidth"} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-net-resource.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-net-resource.md new file mode 100644 index 000000000..7d10a4da3 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-delegate-net-resource.md @@ -0,0 +1,45 @@ +## Обзор + +Здесь показано, как делегировать пропускную способность сети (NET) с одного аккаунта на другой через `cleos system delegatebw` — чтобы выделить NET получателю, при необходимости задействовав и CPU в той же команде. + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Ознакомьтесь с командой [`cleos system delegatebw`](../03_command-reference/system/system-delegatebw.md) и её параметрами. +* Установлена поддерживаемая версия `cleos`. + +!!! note "Примечание" + `cleos` входит в состав ПО COOPOS. При [установке COOPOS](../../00_install/index.md) устанавливается и `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория [`reference-contracts`](https://github.com/Coopenomics/reference-contracts) для управления системными ресурсами. +* Нужны базовые понятия: [аккаунт](../../../accounts.md) и [системные ресурсы NET/CPU](../../../system-resources.md) в COOPOS. + +## Шаги + +Выполните шаг ниже. + +Делегируйте пропускную способность сети (NET) с исходного аккаунта на аккаунт-получатель: + +```sh +cleos system delegatebw +``` + +Здесь `from` — аккаунт, с которого делегируется пропускная способность, `receiver` — аккаунт-получатель, а `stake_net_quantity` и/или `stake_cpu_quantity` — объём токенов в стейке для NET и/или CPU соответственно. + +Ниже приведены примеры. + +* Делегировать 0.01 SYS на пропускную способность сети (NET) от `bob` к `alice`: + +**Пример вывода** + +```sh +cleos system delegatebw bob alice "0.01 SYS" "0 SYS" +``` +```json +executed transaction: 5487afafd67bf459a20fcc2dbc5d0c2f0d1f10e33123eaaa07088046fd18e3ae 192 bytes 503 us +# eosio <= eosio::delegatebw {"from":"bob","receiver":"alice","stake_net_quantity":"0.0100 SYS","stake_cpu_quantity":"0.0000 SYS"... +# eosio.token <= eosio.token::transfer {"from":"bob","to":"eosio.stake","quantity":"0.0010 SYS","memo":"stake bandwidth"} +# bob <= eosio.token::transfer {"from":"bob","to":"eosio.stake","quantity":"0.0010 SYS","memo":"stake bandwidth"} +# eosio.stake <= eosio.token::transfer {"from":"bob","to":"eosio.stake","quantity":"0.0010 SYS","memo":"stake bandwidth"} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-deploy-a-smart-contract.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-deploy-a-smart-contract.md new file mode 100644 index 000000000..442ba0eea --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-deploy-a-smart-contract.md @@ -0,0 +1,22 @@ +## Обзор + +На этой странице описано, как развернуть WASM и ABI смарт-контракта на аккаунте в сети COOPOS командой `cleos set contract` — обычный шаг после сборки контракта в среде разработки. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Разблокируйте кошелёк, в котором есть закрытый ключ аккаунта контракта. + +## Шаги + +Выполните: + +```sh +cleos set contract contract_account contract_folder [wasm-file] [abi-file] +``` + +Подставьте вместо `contract_folder` путь к каталогу с контрактом. + +!!! note "Имя контракта по умолчанию" + По умолчанию `cleos` считает именем контракта последний сегмент пути в `contract_folder` и ожидает файлы `.wasm` и `.abi` с таким именем. Это можно переопределить необязательными параметрами `wasm-file` и `abi-file`. diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-account-information.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-account-information.md new file mode 100644 index 000000000..111cb9275 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-account-information.md @@ -0,0 +1,56 @@ +## Обзор + +В этом руководстве описано, как запросить информацию об аккаунте COOPOS через `cleos get account` — квоты RAM, полосы NET/CPU и дерево разрешений. В примере запрашиваются данные аккаунта `eosio`. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +!!! note "Примечание" + Утилита cleos входит в состав ПО COOPOS. При [установке COOPOS](../../00_install/index.md) устанавливается и cleos. + +* Полезно заранее прочитать раздел [Аккаунты и разрешения](../../../accounts.md) в документации по блокчейну. + +## Справка по командам + +См. справку по использованию cleos и опциям: + +* команда [`cleos get account`](../03_command-reference/get/account.md) и её параметры + +## Процедура + +Ниже показано, как запросить информацию об аккаунте `eosio`: + +1. Выполните команду: + +```sh +cleos get account eosio +``` +**Где**: + +* `eosio` — имя системного аккаунта по умолчанию в блокчейне COOPOS. + +**Пример вывода** + +```console +created: 2018-06-01T12:00:00.000 +privileged: true +permissions: + owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV + active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV +memory: + quota: unlimited used: 3.004 KiB + +net bandwidth: + used: unlimited + available: unlimited + limit: unlimited + +cpu bandwidth: + used: unlimited + available: unlimited + limit: unlimited +``` + +!!! note "Поля аккаунта" + В зависимости от сети COOPOS набор полей аккаунта может отличаться — это определяется развёрнутым системным контрактом. diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-block-information.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-block-information.md new file mode 100644 index 000000000..a499c9b39 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-block-information.md @@ -0,0 +1,81 @@ +## Обзор + +Здесь показано, как запросить у API `nodeos` полные данные блока по номеру или по идентификатору — чтобы проверить время, подпись производителя, состав транзакций и связь с предыдущим блоком при отладке или мониторинге сети. + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Ознакомьтесь с командой [`cleos get block`](../03_command-reference/get/block.md) и её параметрами. +* Установлена поддерживаемая версия `cleos`. + +!!! note "Примечание" + `cleos` входит в состав ПО COOPOS. При [установке COOPOS](../../00_install/index.md) устанавливается и `cleos`. + +* Полезно знать, как [блоки формируются и распространяются по сети](../../../nodes.md), и общие идеи [протокола консенсуса](../../../protocols.md) в COOPOS. + +## Шаги + +Выполните шаг ниже. + +Получите полную информацию о блоке: + +```sh +cleos get block +``` + +Здесь `block_number_or_id` — номер блока или идентификатор блока. + +Ниже приведены примеры. + +* Запросить в тестовой сети полную информацию о блоке с номером `48351112` или с ID `02e1c7888a92206573ae38d00e09366c7ba7bc54cd8b7996506f7d2a619c43ba`: + +**Пример вывода** + +```sh +cleos -u https://choiceofyourprovider get block 48351112 +``` +См. раздел [среда разработки и тестовые сети](../../01_nodeos/02_usage/03_development-environment/index.md) + +```json +{ + "timestamp": "2021-01-28T17:58:59.500", + "producer": "inith", + "confirmed": 0, + "previous": "02e1c78787ff4d4ce6124831b936bb4ef6015e470868a535f1c6e04f3afed8a1", + "transaction_mroot": "0000000000000000000000000000000000000000000000000000000000000000", + "action_mroot": "1bf9d17b5a951cbb6d0a8324e4039744db4137df498abd53046ea26fa74d73c9", + "schedule_version": 1, + "new_producers": null, + "producer_signature": "SIG_K1_JxFfxGA1wZx9LCVjbrBb5nxTuJai7RUSiwRXyY866fYvZZyRtdmQFn9KJCqVHFAiYEsJpDb6dhTmHNDwipJm4rDiyhEmGa", + "transactions": [], + "id": "02e1c7888a92206573ae38d00e09366c7ba7bc54cd8b7996506f7d2a619c43ba", + "block_num": 48351112, + "ref_block_prefix": 3493375603 +} +``` + +* Запросить в тестовой сети полную информацию о блоке с ID `02e1c7888a92206573ae38d00e09366c7ba7bc54cd8b7996506f7d2a619c43ba`: + +**Пример вывода** + +```sh +cleos -u https://choiceofyourprovider get block 02e1c7888a92206573ae38d00e09366c7ba7bc54cd8b7996506f7d2a619c43ba +``` +```json +{ + "timestamp": "2021-01-28T17:58:59.500", + "producer": "inith", + "confirmed": 0, + "previous": "02e1c78787ff4d4ce6124831b936bb4ef6015e470868a535f1c6e04f3afed8a1", + "transaction_mroot": "0000000000000000000000000000000000000000000000000000000000000000", + "action_mroot": "1bf9d17b5a951cbb6d0a8324e4039744db4137df498abd53046ea26fa74d73c9", + "schedule_version": 1, + "new_producers": null, + "producer_signature": "SIG_K1_JxFfxGA1wZx9LCVjbrBb5nxTuJai7RUSiwRXyY866fYvZZyRtdmQFn9KJCqVHFAiYEsJpDb6dhTmHNDwipJm4rDiyhEmGa", + "transactions": [], + "id": "02e1c7888a92206573ae38d00e09366c7ba7bc54cd8b7996506f7d2a619c43ba", + "block_num": 48351112, + "ref_block_prefix": 3493375603 +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-tables-information.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-tables-information.md new file mode 100644 index 000000000..30790fa0a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-tables-information.md @@ -0,0 +1,15 @@ +## Обзор + +Здесь показана команда `cleos get table` для чтения строк таблицы состояния смарт-контракта по аккаунту контракта, scope и имени таблицы — удобно для отладки и инспекции данных на цепи. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Нужны базовые понятия: [аккаунт контракта](../../../accounts.md), а также что такое таблица и scope в модели хранения состояния WASM-контракта (первичный ключ и область видимости строк). + +## Шаги + +```sh +cleos get table ACCOUNT SCOPE TABLE +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-transaction-information.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-transaction-information.md new file mode 100644 index 000000000..34872e580 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-get-transaction-information.md @@ -0,0 +1,199 @@ +## Обзор + +В этом руководстве описано, как получить по ID полные данные транзакции в COOPOS — например, чтобы разобрать действия, подписи и след в блоке после отладки или инцидента. + +В примере запрашиваются данные транзакции, связанной с созданием аккаунта **bob**. + +## Перед началом + +Убедитесь, что выполнены следующие требования: +* Установлена поддерживаемая версия `cleos`. +!!! note "Примечание" + `cleos` входит в состав ПО COOPOS. При [установке COOPOS](../../00_install/index.md) устанавливается и `cleos`. +* Полезно заранее знать, [как устроены транзакции](../../../transactions.md) в блокчейне COOPOS. + +## Справка по командам + +См. справку по использованию `cleos` и опциям: + +* команда [`cleos get transaction`](../03_command-reference/get/transaction.md) и её параметры + +## Процедура + +Ниже показано, как получить информацию о транзакции, связанной с созданием аккаунта **bob**. + +1. Запросите транзакцию по ID: +```sh +cleos get transaction 870a6b6e3882061ff0f64016e1eedfdd9439e2499bf978c3fb29fcedadada9b1 +``` +* Здесь `870a6b6e38...dada9b1` — идентификатор транзакции создания аккаунта **bob**. + +**Пример вывода** + +Команда `cleos` возвращает подробные данные транзакции: + +```json +{ + "id": "870a6b6e3882061ff0f64016e1eedfdd9439e2499bf978c3fb29fcedadada9b1", + "trx": { + "receipt": { + "status": "executed", + "cpu_usage_us": 3493, + "net_usage_words": 25, + "trx": [ + 1,{ + "signatures": [ + "SIG_K1_KYEvKx3nC81H6brKXHNjhrw32rNtTC2dP6nYFjZvj1N3k7KSU4CXBTJyiXd38ANu2ZPTUf66qUghUp5Jarkhiqdx3D8pwf" + ], + "compression": "none", + "packed_context_free_data": "", + "packed_trx": "0c252e60fe001fe2acca00000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed3232660000000000ea30550000000000000e3d01000000010002dfcee032f2e84bfc8ecc5c10fffb870ec1c690c1f3fdae3d8b7d65690b6455560100000001000000010002dfcee032f2e84bfc8ecc5c10fffb870ec1c690c1f3fdae3d8b7d65690b6455560100000000" + } + ] + }, + "trx": { + "expiration": "2021-02-18T08:27:56", + "ref_block_num": 254, + "ref_block_prefix": 3400327711, + "max_net_usage_words": 0, + "max_cpu_usage_ms": 0, + "delay_sec": 0, + "context_free_actions": [], + "actions": [{ + "account": "eosio", + "name": "newaccount", + "authorization": [{ + "actor": "eosio", + "permission": "active" + } + ], + "data": { + "creator": "eosio", + "name": "bob", + "owner": { + "threshold": 1, + "keys": [{ + "key": "EOS6b4ENeXffuKGmsk3xCk3kbFM5M8dcANrUa9Mj9RzKLNhPKhzyj", + "weight": 1 + } + ], + "accounts": [], + "waits": [] + }, + "active": { + "threshold": 1, + "keys": [{ + "key": "EOS6b4ENeXffuKGmsk3xCk3kbFM5M8dcANrUa9Mj9RzKLNhPKhzyj", + "weight": 1 + } + ], + "accounts": [], + "waits": [] + } + }, + "hex_data": "0000000000ea30550000000000000e3d01000000010002dfcee032f2e84bfc8ecc5c10fffb870ec1c690c1f3fdae3d8b7d65690b6455560100000001000000010002dfcee032f2e84bfc8ecc5c10fffb870ec1c690c1f3fdae3d8b7d65690b64555601000000" + } + ], + "transaction_extensions": [], + "signatures": [ + "SIG_K1_KYEvKx3nC81H6brKXHNjhrw32rNtTC2dP6nYFjZvj1N3k7KSU4CXBTJyiXd38ANu2ZPTUf66qUghUp5Jarkhiqdx3D8pwf" + ], + "context_free_data": [] + } + }, + "block_time": "2021-02-18T08:27:27.000", + "block_num": 256, + "last_irreversible_block": 305, + "traces": [{ + "action_ordinal": 1, + "creator_action_ordinal": 0, + "closest_unnotified_ancestor_action_ordinal": 0, + "receipt": { + "receiver": "eosio", + "act_digest": "2640ce4d4a789393dec3b7938cea2f78c5669498d0d22adeab9204c489c2cfd6", + "global_sequence": 256, + "recv_sequence": 256, + "auth_sequence": [[ + "eosio", + 256 + ] + ], + "code_sequence": 0, + "abi_sequence": 0 + }, + "receiver": "eosio", + "act": { + "account": "eosio", + "name": "newaccount", + "authorization": [{ + "actor": "eosio", + "permission": "active" + } + ], + "data": { + "creator": "eosio", + "name": "bob", + "owner": { + "threshold": 1, + "keys": [{ + "key": "EOS6b4ENeXffuKGmsk3xCk3kbFM5M8dcANrUa9Mj9RzKLNhPKhzyj", + "weight": 1 + } + ], + "accounts": [], + "waits": [] + }, + "active": { + "threshold": 1, + "keys": [{ + "key": "EOS6b4ENeXffuKGmsk3xCk3kbFM5M8dcANrUa9Mj9RzKLNhPKhzyj", + "weight": 1 + } + ], + "accounts": [], + "waits": [] + } + }, + "hex_data": "0000000000ea30550000000000000e3d01000000010002dfcee032f2e84bfc8ecc5c10fffb870ec1c690c1f3fdae3d8b7d65690b6455560100000001000000010002dfcee032f2e84bfc8ecc5c10fffb870ec1c690c1f3fdae3d8b7d65690b64555601000000" + }, + "context_free": false, + "elapsed": 1565, + "console": "", + "trx_id": "870a6b6e3882061ff0f64016e1eedfdd9439e2499bf978c3fb29fcedadada9b1", + "block_num": 256, + "block_time": "2021-02-18T08:27:27.000", + "producer_block_id": null, + "account_ram_deltas": [{ + "account": "bob", + "delta": 2724 + } + ], + "except": null, + "error_code": null + } + ] +} +``` + +!!! note + Для запроса информации о транзакции нужен экземпляр `nodeos` с включёнными [плагином history](../../01_nodeos/03_plugins/history_plugin/index.md) и [плагином history API](../../01_nodeos/03_plugins/history_api_plugin/index.md). + +## Итог + +Следуя этим шагам, вы получаете информацию о транзакции по её идентификатору. + +## Устранение неполадок + +Если в `nodeos` в файле **config.ini** не включены [плагин history](../../01_nodeos/03_plugins/history_plugin/index.md) и [плагин history API](../../01_nodeos/03_plugins/history_api_plugin/index.md), команда `cleos get transaction` с ID завершится ошибкой, например: + +```sh +cleos get transaction 509eee3aa8988d533a336fec7a4c8b067ae3205cd97e2d27b3e9a2da61ef460c +``` +```console +Error 3110003: Missing History API Plugin +Ensure that you have eosio::history_api_plugin added to your node's configuration! +Error Details: +History API plugin is not enabled +``` + +Чтобы устранить ошибку, включите [плагин history](../../01_nodeos/03_plugins/history_plugin/index.md) и [плагин history API](../../01_nodeos/03_plugins/history_api_plugin/index.md), затем выполните команду снова. diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-import-a-key.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-import-a-key.md new file mode 100644 index 000000000..f0f632ab6 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-import-a-key.md @@ -0,0 +1,50 @@ +## Обзор + +В этом руководстве описано, как импортировать закрытый ключ в кошелёк `keosd` по умолчанию, чтобы `cleos` мог подписывать транзакции от имени соответствующего аккаунта в блокчейне COOPOS. + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Создайте кошелёк по умолчанию командой `cleos wallet create`. Инструкции — в разделе [Как создать кошелёк](../02_how-to-guides/how-to-create-a-wallet.md). +* Откройте и разблокируйте созданный кошелёк. +* Ознакомьтесь с командой [`cleos wallet import`](../03_command-reference/wallet/import.md). +* Установлена поддерживаемая версия `cleos`. +* Нужны базовые понятия: пара [открытого и закрытого ключа](../../../accounts.md) в модели аккаунтов COOPOS. + +!!! note "Состав COOPOS" + `cleos` входит в пакет COOPOS; при [установке из исходников](../../00_install/index.md) ставится вместе с `nodeos` и `keosd`. + +## Справка по командам + +См. справку по использованию `cleos` и опциям: + +* [cleos wallet import](../03_command-reference/wallet/import.md) — команда и параметры + +## Процедура + +Ниже показано, как импортировать закрытый ключ в существующий кошелёк `keosd` по умолчанию: + +1. Выполните команду импорта закрытого ключа в кошелёк по умолчанию. Будет запрошен закрытый ключ: +```sh +cleos wallet import +``` +```console +private key: +``` + +2. Введите закрытый ключ и нажмите Enter. +```sh +*** +``` + +**Пример вывода** + +Команда подтверждает успешный импорт, выводя соответствующий открытый ключ: +```console +imported private key for: EOS8FBXJUfbANf3xeDWPoJxnip3Ych9HjzLBr1VaXRQFdkVAxwLE7 +``` + +## Итог + +Следуя этим шагам, вы импортируете закрытый ключ в кошелёк по умолчанию. diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-link-permission.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-link-permission.md new file mode 100644 index 000000000..0cd2cb9aa --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-link-permission.md @@ -0,0 +1,17 @@ +## Обзор + +Здесь показано, как привязать отдельное разрешение к конкретному действию (action) контракта через `cleos set action permission` — чтобы для вызова, например, `transfer` использовался не `active`, а специальное минимально необходимое разрешение. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Нужны базовые понятия: [аккаунт и уровни разрешений](../../../accounts.md), а также действие (action) смарт-контракта в модели COOPOS/EOSIO (см. [транзакции](../../../transactions.md)). + +## Шаги + +Свяжите уровень разрешения `permlvl` с действием `transfer` контракта `hodlcontract`: + +```sh +cleos set action permission alice hodlcontract transfer permlvl +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-list-all-key-pairs.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-list-all-key-pairs.md new file mode 100644 index 000000000..8b4d2521a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-list-all-key-pairs.md @@ -0,0 +1,113 @@ +## Обзор + +В этом руководстве описано, как вывести список всех открытых ключей и пар открытый/закрытый в кошельке `keosd` по умолчанию — чтобы проверить, какие ключи доступны для подписи, и при необходимости скопировать открытый ключ. Эти ключи используются для авторизации транзакций в блокчейне COOPOS. + +В примере показаны все открытые ключи и пары, хранящиеся в существующем кошельке по умолчанию. + +## Перед началом + +Убедитесь, что выполнены следующие требования: + +* Создайте кошелёк по умолчанию командой `cleos wallet create`. Инструкции — в разделе [Как создать кошелёк](../02_how-to-guides/how-to-create-a-wallet.md). +* [Создайте пару ключей](../03_command-reference/wallet/create_key.md) в кошельке по умолчанию. +* Ознакомьтесь с командами [`cleos wallet`](../03_command-reference/wallet/index.md). +* Установлена поддерживаемая версия `cleos`. +!!! note "Примечание" + `cleos` входит в состав ПО COOPOS. При [установке COOPOS](../../00_install/index.md) устанавливается и `cleos`. +* Нужны базовые понятия: пара [открытого и закрытого ключа](../../../accounts.md) в модели аккаунтов COOPOS. + +## Справка по командам + +См. справку по использованию `cleos` и опциям: + +* команда [`cleos wallet keys`](../03_command-reference/wallet/keys.md) и её параметры +* команда [`cleos wallet private_keys`](../03_command-reference/wallet/private_keys.md) и её параметры + +## Процедура + +Ниже показано, как вывести все открытые ключи и пары открытый/закрытый в кошельке `keosd` по умолчанию: + +1. Откройте кошелёк по умолчанию: +```sh +cleos wallet open +``` +```console +Opened: default +``` + +2. Разблокируйте кошелёк по умолчанию. Будет запрошен пароль: +```sh +cleos wallet unlock +``` +```console +password: +``` + +3. Введите пароль, заданный при создании кошелька по умолчанию: +```sh +*** +``` +Если пароль верный, кошелёк разблокируется: +```console +Unlocked: default +``` + +4. Выведите все открытые ключи в кошельке по умолчанию: +```sh +cleos wallet keys +``` +**Пример вывода** +```console +[ + "EOS5VCUBtxS83ZKqVcWtDBF4473P9HyrvnCM9NBc4Upk1C387qmF3" +] +``` + +5. Выведите все пары открытый/закрытый в кошельке по умолчанию. Будет запрошен пароль: +```sh +cleos wallet private_keys +``` +```console +password: +``` + +6. Введите пароль, заданный при создании кошелька по умолчанию: +```sh +*** +``` +**Пример вывода** +Если пароль верный, выводятся пары открытый/закрытый: +```console +password: [[ + "EOS5VCUBt****************************************F3", + "5JnuuGM1S****************************************4D" + ] +] +``` + +!!! warning "Внимание" + Никогда не раскрывайте закрытые ключи в продуктивной среде. + +!!! note "Примечание" + Если команды ничего не выводят, убедитесь, что вы создали пары ключей и импортировали закрытые ключи в кошелёк. + +## Итог + +Следуя этим шагам, вы получаете список всех открытых ключей и пар открытый/закрытый в кошельке `keosd` по умолчанию. + +## Устранение неполадок + +При выполнении `cleos wallet open` / `cleos wallet unlock` может появиться такая ошибка CLI: + +```sh +cleos wallet open +``` +```console +No wallet service listening on ***. Cannot automatically start keosd because keosd was not found. +Failed to connect to keosd at unix:///Users/xxx.xxx/eosio-wallet/keosd.sock; is keosd running? +``` + +Чтобы устранить ошибку, убедитесь, что на машине запущена утилита `keosd`: +```sh +keosd +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-stake-resource.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-stake-resource.md new file mode 100644 index 000000000..0758dcc48 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-stake-resource.md @@ -0,0 +1,25 @@ +## Обзор + +Здесь приведены примеры, как застейкать NET и/или CPU на свой же аккаунт через `cleos system delegatebw` — чтобы увеличить доступные ресурсы для транзакций и хранения состояния контрактов. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория `eosio.contracts` для управления системными ресурсами. + +* Нужны базовые понятия: [аккаунт](../../../accounts.md) и [системные ресурсы NET/CPU](../../../system-resources.md). + +## Шаги + +Застейкать 0.01 SYS пропускной способности CPU для `alice`: + +```sh +cleos system delegatebw alice alice "0 SYS" "0.01 SYS" +``` + +Застейкать 0.01 SYS пропускной способности CPU для `alice`: + +```sh +cleos system delegatebw alice alice "0.01 SYS" "0 SYS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-submit-a-transaction.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-submit-a-transaction.md new file mode 100644 index 000000000..cd34fc5f9 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-submit-a-transaction.md @@ -0,0 +1,88 @@ +## Обзор + +На этой странице описано, как отправить (push) готовую транзакцию в сеть через `cleos push transaction`: вы формируете JSON транзакции и передаёте его файлом или строкой. Это нужно, когда транзакция уже собрана и её остаётся только подписать и доставить в `nodeos`. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. +* Нужны базовые понятия: [что такое транзакция](../../../transactions.md) и как собрать корректный JSON транзакции (поля `expiration`, `ref_block_*`, `actions` и т.д.). + +## Шаги + +* Создайте JSON-фрагмент с валидной транзакцией, например: + +```JSON +{ + "expiration": "2019-08-01T07:15:49", + "ref_block_num": 34881, + "ref_block_prefix": 2972818865, + "max_net_usage_words": 0, + "max_cpu_usage_ms": 0, + "delay_sec": 0, + "context_free_actions": [], + "actions": [{ + "account": "eosio.token", + "name": "transfer", + "authorization": [{ + "actor": "han", + "permission": "active" + } + ], + "data": "000000000000a6690000000000ea305501000000000000000453595300000000016d" + } + ], + "transaction_extensions": [], + "context_free_data": [] +} +``` + +* Можно также использовать для поля `data` читаемый JSON. + +!!! note "Читаемый JSON в `data`" + Если в `data` задан читаемый JSON, `cleos` запрашивает нужные ABI через API `nodeos`; это создаёт дополнительную нагрузку на `nodeos`. + +```JSON +{ + "expiration": "2019-08-01T07:15:49", + "ref_block_num": 34881, + "ref_block_prefix": 2972818865, + "max_net_usage_words": 0, + "max_cpu_usage_ms": 0, + "delay_sec": 0, + "context_free_actions": [], + "actions": [{ + "account": "eosio.token", + "name": "transfer", + "authorization": [{ + "actor": "han", + "permission": "active" + } + ], + "data": { + "from": "han", + "to": "eosio", + "quantity": "0.0001 SYS", + "memo": "m" + } + } + ], + "transaction_extensions": [], + "context_free_data": [] +} +``` + +* Выполните команду: + +```sh +cleos push transaction TRX_FILE.json +``` + +* Отправить транзакцию из JSON: + +```sh +cleos push transaction JSON +``` + + diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-transfer-an-eosio.token-token.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-transfer-an-eosio.token-token.md new file mode 100644 index 000000000..1d004f7f3 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-transfer-an-eosio.token-token.md @@ -0,0 +1,19 @@ +## Обзор + +Здесь показано, как выполнить перевод основного токена сети через контракт `eosio.token` командой `cleos transfer` — типовая операция между аккаунтами при подключении к рабочей ноде. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Вы переводите токен, созданный контрактом eosio.token, и контракт eosio.token развёрнут в сети, к которой вы подключены. + +* Нужны базовые понятия: [транзакции](../../../transactions.md). Имейте в виду: переводы токенов на цепи необратимы. + +## Шаги + +Чтобы перевести `0.0001 SYS` на аккаунт `bob` с аккаунта `alice`, выполните: + +```sh +cleos transfer alice bob "0.0001 SYS" "Hodl!" -p alice@active +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-CPU.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-CPU.md new file mode 100644 index 000000000..6a41becd6 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-CPU.md @@ -0,0 +1,27 @@ +## Обзор + +Здесь показано, как снять делегирование CPU с аккаунта получателя обратно на аккаунт-делегатор (`cleos system undelegatebw`). Снять делегирование может только тот аккаунт, который изначально делегировал ресурс. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория `eosio.contracts` для управления системными ресурсами. + +* Нужны базовые понятия: [аккаунт](../../../accounts.md) и [системные ресурсы NET/CPU](../../../system-resources.md). + +## Шаги + +Снять делегирование 0.01 SYS пропускной способности CPU с аккаунта `alice` обратно на аккаунт `bob`: + +```sh +cleos system undelegatebw bob alice "0 SYS" "0.01 SYS" +``` + +Вывод должен быть примерно таким: + +```console +executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606 184 bytes 452 us +# eosio <= eosio::undelegatebw {"from":"alice","receiver":"bob","unstake_net_quantity":"0.0000 EOS","unstake_cpu_qu... +warning: transaction executed locally, but may not be confirmed by the network yet ] +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-NET.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-NET.md new file mode 100644 index 000000000..7ebad3c1d --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-undelegate-NET.md @@ -0,0 +1,27 @@ +## Обзор + +Здесь показано, как снять делегирование NET с аккаунта получателя обратно на аккаунт, который изначально делегировал ресурс (`cleos system undelegatebw`). Снять делегирование может только исходный делегатор. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория `eosio.contracts` для управления системными ресурсами. + +* Нужны базовые понятия: [аккаунт](../../../accounts.md) и [системные ресурсы NET/CPU](../../../system-resources.md). + +## Шаги + +Снять делегирование 0.01 SYS пропускной способности сети с аккаунта `alice` обратно на аккаунт `bob`: + +```sh +cleos system undelegatebw bob alice "0 SYS" "0.01 SYS" +``` + +Вывод должен быть примерно таким: + +```console +executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606 184 bytes 452 us +# eosio <= eosio::undelegatebw {"from":"alice","receiver":"bob","unstake_net_quantity":"0.01 EOS","unstake_cpu_qu... +warning: transaction executed locally, but may not be confirmed by the network yet ] +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unlink-permission.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unlink-permission.md new file mode 100644 index 000000000..93d5a89bc --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unlink-permission.md @@ -0,0 +1,17 @@ +## Обзор + +Здесь показано, как убрать привязку разрешения к действию контракта (`cleos set action permission` с `NULL`), вернув для этого действия поведение по умолчанию. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Нужны базовые понятия: [аккаунт и уровни разрешений](../../../accounts.md), а также действие (action) смарт-контракта (см. [транзакции](../../../transactions.md)). + +## Шаги + +Удалите связанный уровень разрешения у действия `transfer` контракта `hodlcontract`: + +```sh +cleos set action permission alice hodlcontract transfer NULL +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-CPU.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-CPU.md new file mode 100644 index 000000000..f85ce6b0e --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-CPU.md @@ -0,0 +1,27 @@ +## Обзор + +Здесь показано, как вывести стейк CPU со своего аккаунта через `cleos system undelegatebw`. Снять делегирование может только тот аккаунт, который изначально делегировал ресурс. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория `eosio.contracts` для управления системными ресурсами. + +* Нужны базовые понятия: [аккаунт](../../../accounts.md) и [системные ресурсы NET/CPU](../../../system-resources.md). + +## Шаги + +Вывести стейк 0.01 SYS пропускной способности CPU с аккаунта `alice`: + +```sh +cleos system undelegatebw alice alice "0.01 SYS" "0 SYS" +``` + +Вывод должен быть примерно таким: + +```console +executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606 184 bytes 452 us +# eosio <= eosio::undelegatebw {"from":"alice","receiver":"alice","unstake_net_quantity":"0.0000 EOS","unstake_cpu_qu... +warning: transaction executed locally, but may not be confirmed by the network yet ] +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-NET.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-NET.md new file mode 100644 index 000000000..23a342cdb --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-unstake-NET.md @@ -0,0 +1,27 @@ +## Обзор + +Здесь показано, как вывести стейк NET со своего аккаунта через `cleos system undelegatebw`. Снять делегирование может только тот аккаунт, который изначально делегировал ресурс. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория `eosio.contracts` для управления системными ресурсами. + +* Нужны базовые понятия: [аккаунт](../../../accounts.md) и [системные ресурсы NET/CPU](../../../system-resources.md). + +## Шаги + +Вывести стейк 0.01 SYS пропускной способности сети с аккаунта `alice`: + +```sh +cleos system undelegatebw alice alice "0 SYS" "0.01 SYS" +``` + +Вывод должен быть примерно таким: + +```console +executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606 184 bytes 452 us +# eosio <= eosio::undelegatebw {"from":"alice","receiver":"alice","unstake_net_quantity":"0.01 EOS","unstake_cpu_qu... +warning: transaction executed locally, but may not be confirmed by the network yet ] +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-vote.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-vote.md new file mode 100644 index 000000000..c27f81aa5 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/how-to-vote.md @@ -0,0 +1,28 @@ +## Обзор + +Здесь показано, как отдать голос за одного или нескольких производителей блоков через `cleos system voteproducer` в сети с классическим контрактом `eosio.system`. + +## Перед началом + +* Установлена поддерживаемая версия `cleos`. + +* Развёрнуты и используются эталонные системные контракты из репозитория `eosio.contracts` для управления системными ресурсами. + +* Полезно знать, кто такие производители блоков и как в вашей сети устроено голосование; общий контекст — в разделах [ноды и делегаты](../../../nodes.md) и [протоколы](../../../protocols.md). + +* Разблокируйте кошелёк. + +## Шаги + +Если вы голосуете за `blockproducer1` и `blockproducer2` с аккаунта `eosiotestts2`, выполните: + +```sh +cleos system voteproducer prods eosiotestts2 blockproducer1 blockproducer2 +``` + +Вывод должен быть примерно таким: + +```console +executed transaction: 2d8b58f7387aef52a1746d7a22d304bbbe0304481d7751fc4a50b619df62676d 128 bytes 374 us +# eosio <= eosio::voteproducer {"voter":"eosiotestts2","proxy":"","producers":["blockproducer1","blockproducer2"]} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/index.md b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/index.md new file mode 100644 index 000000000..206024f55 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/02_how-to-guides/index.md @@ -0,0 +1,29 @@ +# Руководства по cleos (how-to) + +Ниже — пошаговые заметки по **cleos**. + +- [Подключение к сети](how-to-connect-a-specific-network.md) +- [Создание кошелька](how-to-create-a-wallet.md) +- [Создание пары ключей](how-to-create-key-pairs.md) +- [Список пар ключей](how-to-list-all-key-pairs.md) +- [Импорт ключа](how-to-import-a-key.md) +- [Создание аккаунта](how-to-create-an-account.md) +- [Информация об аккаунте](how-to-get-account-information.md) +- [Мультисиг-аккаунт](how-to-config-a-multisig-account.md) +- [Связать разрешение](how-to-link-permission.md) +- [Отвязать разрешение](how-to-unlink-permission.md) +- [Информация о блоке](how-to-get-block-information.md) +- [Информация о транзакции](how-to-get-transaction-information.md) +- [Таблицы контракта](how-to-get-tables-information.md) +- [Отправка транзакции](how-to-submit-a-transaction.md) +- [Перевод токена eosio.token](how-to-transfer-an-eosio.token-token.md) +- [Покупка RAM](how-to-buy-ram.md) +- [Делегирование NET](how-to-delegate-net-resource.md) +- [Делегирование CPU](how-to-delegate-CPU-resource.md) +- [Снятие делегирования NET](how-to-undelegate-NET.md) +- [Снятие делегирования CPU](how-to-undelegate-CPU.md) +- [Вывод стейка NET](how-to-unstake-NET.md) +- [Вывод стейка CPU](how-to-unstake-CPU.md) +- [Стейк ресурса](how-to-stake-resource.md) +- [Развёртывание контракта](how-to-deploy-a-smart-contract.md) +- [Голосование](how-to-vote.md) diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/index.md new file mode 100644 index 000000000..d61d18740 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/index.md @@ -0,0 +1,8 @@ +## Описание +Упаковка и распаковка транзакций + +## Подкоманды +- [pack_transaction](pack_transaction.md) — из обычного подписанного JSON в упакованный вид +- [unpack_transaction](unpack_transaction.md) — из упакованного в обычный подписанный JSON +- [pack_action_data](pack_action_data.md) — из JSON данных действия в упакованный вид +- [unpack_action_data](unpack_action_data.md) — из упакованных данных действия в JSON diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_action_data.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_action_data.md new file mode 100644 index 000000000..c4bd7d936 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_action_data.md @@ -0,0 +1,23 @@ +## Описание +Из JSON данных действия в упакованный вид + +## Позиционные параметры +- `account` _TEXT_ — аккаунт, на котором развёрнут контракт +- `name` _TEXT_ — имя вызываемого действия +- `unpacked_action_data` _TEXT_ — данные действия в JSON + +## Опции + +- `-h,--help` — вывести справку и выйти + +## Использование +```sh + cleos convert pack_action_data eosio unlinkauth '{"account":"test1", "code":"test2", "type":"eosioeosio"}' +``` + +## Вывод + + +```console +000000008090b1ca000000000091b1ca000075982aea3055 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_transaction.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_transaction.md new file mode 100644 index 000000000..55294cbaa --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/pack_transaction.md @@ -0,0 +1,50 @@ +## Описание + +Из обычного подписанного JSON в упакованный вид + +## Позиционные параметры + +- `transaction` _TEXT_ — обычная подписанная транзакция в JSON (строка) + +## Опции + +- `-h,--help` — вывести справку и выйти +- `--pack-action-data` — упаковать все данные действий внутри транзакции (требуется обращение к `nodeos`) + +## Использование + + +```sh +cleos convert pack_transaction '{ + "expiration": "2018-08-02T20:24:36", + "ref_block_num": 14207, + "ref_block_prefix": 1438248607, + "max_net_usage_words": 0, + "max_cpu_usage_ms": 0, + "delay_sec": 0, + "context_free_actions": [], + "actions": [{ + "account": "eosio", + "name": "newaccount", + "authorization": [{ + "actor": "eosio", + "permission": "active" + } + ], + "data": "0000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d801000000" + } + ], + "transaction_extensions": [] +}' +``` + +## Вывод + +```json +{ + "signatures": [], + "compression": "none", + "packed_context_free_data": "", + "packed_trx": "8468635b7f379feeb95500000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed3232660000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d80100000000" +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_action_data.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_action_data.md new file mode 100644 index 000000000..d21d6db47 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_action_data.md @@ -0,0 +1,28 @@ +## Описание +Из упакованных данных действия в JSON + +## Позиционные параметры +- `account` _TEXT_ — аккаунт, на котором развёрнут контракт +- `name` _TEXT_ — имя вызываемого действия +- `packed_action_data` _TEXT_ — данные действия в виде упакованной hex-строки +## Опции + +- `-h,--help` — вывести справку и выйти + +## Использование + + +```sh + cleos convert unpack_action_data eosio unlinkauth 000000008090b1ca000000000091b1ca000075982aea3055 +``` + +## Вывод + + +```json +{ + "account": "test1", + "code": "test2", + "type": "eosioeosio" +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_transaction.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_transaction.md new file mode 100644 index 000000000..0d08f2ab8 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/convert/unpack_transaction.md @@ -0,0 +1,57 @@ +## Описание + +Из упакованного вида в обычный подписанный JSON + +## Позиционные параметры + +- `transaction` _TEXT_ — JSON упакованной транзакции (строка с полями `packed_trx` и при необходимости `compression`) + +## Опции + +- `-h,--help` — вывести справку и выйти +- `--unpack-action-data` — распаковать все данные действий внутри транзакции (требуется обращение к `nodeos`) + +## Использование + +```sh +cleos convert unpack_transaction '{ + "signatures": [ + "SIG_K1_KmRbWahefwxs6uyCGNR6wNRjw7cntEeFQhNCbyg8S92Kbp7zdSSVGTD2QS7pNVWgcU126zpxaBp9CwUxFpRwSnfkjd46bS" + ], + "compression": "none", + "packed_context_free_data": "", + "packed_trx": "8468635b7f379feeb95500000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed3232660000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d80100000000" +}' +``` + +## Вывод + + +```json +{ + "expiration": "2018-08-02T20:24:36", + "ref_block_num": 14207, + "ref_block_prefix": 1438248607, + "max_net_usage_words": 0, + "max_cpu_usage_ms": 0, + "delay_sec": 0, + "context_free_actions": [], + "actions": [{ + "account": "eosio", + "name": "newaccount", + "authorization": [{ + "actor": "eosio", + "permission": "active" + } + ], + "data": "0000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d801000000" + } + ], + "transaction_extensions": [], + "signatures": [ + "SIG_K1_KmRbWahefwxs6uyCGNR6wNRjw7cntEeFQhNCbyg8S92Kbp7zdSSVGTD2QS7pNVWgcU126zpxaBp9CwUxFpRwSnfkjd46bS" + ], + "context_free_data": [] +} + +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/account.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/account.md new file mode 100644 index 000000000..8f55bcdf7 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/account.md @@ -0,0 +1,72 @@ +## Описание +Создать новый аккаунт в блокчейне (предполагается, что системный контракт не ограничивает использование RAM) + +## Использование + +```console +Usage: cleos create account [OPTIONS] creator name OwnerKey [ActiveKey] + +Positionals: + creator TEXT The name of the account creating the new account (required) + name TEXT The name of the new account (required) + OwnerKey TEXT The owner public key or permission level for the new account (required) + ActiveKey TEXT The active public key or permission level for the new account + +Options: + -h,--help Print this help message and exit + -x,--expiration set the time in seconds before a transaction expires, defaults to 30s + -f,--force-unique force the transaction to be unique. this will consume extra bandwidth and remove any protections against accidently issuing the same transaction multiple times + -s,--skip-sign Specify if unlocked wallet keys should be used to sign transaction + -j,--json print result as json + --json-file TEXT save result in json format into a file + -d,--dont-broadcast don't broadcast transaction to the network (just print to stdout) + --return-packed used in conjunction with --dont-broadcast to get the packed transaction + -r,--ref-block TEXT set the reference block num or block id used for TAPOS (Transaction as Proof-of-Stake) + --use-old-rpc use old RPC push_transaction, rather than new RPC send_transaction + -p,--permission TEXT ... An account and permission level to authorize, as in 'account@permission' (defaults to 'creator@active') + --max-cpu-usage-ms UINT set an upper limit on the milliseconds of cpu usage budget, for the execution of the transaction (defaults to 0 which means no limit) + --max-net-usage UINT set an upper limit on the net usage budget, in bytes, for the transaction (defaults to 0 which means no limit) + --delay-sec UINT set the delay_sec seconds, defaults to 0s +``` + +## Команда +Для создания аккаунта нужна пара ключей COOPOS. Ключи COOPOS можно сгенерировать командой `cleos create key`. + +```sh +cleos create account inita tester EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA +``` + +## Вывод + +```json +{ + "transaction_id": "6acd2ece68c4b86c1fa209c3989235063384020781f2c67bbb80bc8d540ca120", + "processed": { + "refBlockNum": "25217", + "refBlockPrefix": "2095475630", + "expiration": "2017-07-25T17:54:55", + "scope": [ + "eos", + "inita" + ], + "signatures": [], + "messages": [{ + "code": "eos", + "type": "newaccount", + "authorization": [{ + "account": "inita", + "permission": "active" + } + ], + "data": "c9251a0000000000b44c5a2400000000010000000102bcca6347d828d4e1868b7dfa91692a16d5b20d0ee3d16a7ca2ddcc7f6dd03344010000010000000102bcca6347d828d4e1868b7dfa91692a16d5b20d0ee3d16a7ca2ddcc7f6dd03344010000010000000001c9251a000000000061d0640b000000000100010000000000000008454f5300000000" + } + ], + "output": [{ + "notify": [], + "sync_transactions": [], + "async_transactions": [] + } + ] + } +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/index.md new file mode 100644 index 000000000..6572e2f9f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/index.md @@ -0,0 +1,15 @@ +## Описание +Создать различные сущности вне и в блокчейне + +## Подкоманды +- [key](key.md) — создать новую пару ключей и вывести публичный и приватный ключ +- [account](account.md) — создать новый аккаунт в блокчейне + +```console +Create various items, on and off the blockchain +Usage: cleos create SUBCOMMAND + +Subcommands: + key Create a new keypair and print the public and private keys + account Create a new account on the blockchain +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/key.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/key.md new file mode 100644 index 000000000..873b211ae --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/create/key.md @@ -0,0 +1,28 @@ +## Описание + +Создаёт новую пару ключей и выводит публичный и приватный ключ + +## Использование + +```console +Usage: cleos create key [OPTIONS] + +Options: + -h,--help Print this help message and exit + --r1 Generate a key using the R1 curve (iPhone), instead of the K1 curve (Bitcoin) + -f,--file TEXT Name of file to write private/public key output to. (Must be set, unless "--to-console" is passed + --to-console Print private/public keys to console. +``` + +## Команда + +```sh +cleos create key -f passwd +``` + +## Вывод + +```console +Private key: 5KCkcSxYKZfh5Cr8CCunS2PiUKzNZLhtfBjudaUnad3PDargFQo +Public key: EOS5uHeBsURAT6bBXNtvwKtWaiDSDJSdSmc96rHVws5M1qqVCkAm6 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/abi.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/abi.md new file mode 100644 index 000000000..81802e8d3 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/abi.md @@ -0,0 +1,18 @@ +## Описание +Получить ABI аккаунта + +## Позиционные параметры +- `name` _TEXT_ — аккаунт, чей ABI нужно получить + +## Опции +- `-f,--file` _TEXT_ — файл для сохранения `.abi` вместо вывода в консоль + +## Примеры +Получить и сохранить ABI контракта eosio.token + +```sh +cleos get abi eosio.token -f eosio.token.abi +``` +```console +saving abi to eosio.token.abi +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/account.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/account.md new file mode 100644 index 000000000..2b56b1ebd --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/account.md @@ -0,0 +1,109 @@ +## Описание +Получить аккаунт из блокчейна + +## Позиционные параметры +- `name` _TEXT_ — имя запрашиваемого аккаунта +- `core-symbol` _TEXT_ — ожидаемый базовый символ сети + +## Опции +- `-j,--json` — вывод в формате JSON + +## Примеры + +### Форматированные данные для пользователя **eosio** + +```sh +cleos get account eosio +``` +```console +privileged: true +permissions: + owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV + active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV +memory: + quota: -1 bytes used: 1.22 Mb + +net bandwidth: (averaged over 3 days) + used: -1 bytes + available: -1 bytes + limit: -1 bytes + +cpu bandwidth: (averaged over 3 days) + used: -1 us + available: -1 us + limit: -1 us + +producers: +``` +### JSON для пользователя **eosio** + +```sh +cleos get account eosio --json +``` +```json +{ + "account_name": "eosio", + "privileged": true, + "last_code_update": "2018-05-23T18:00:25.500", + "created": "2018-03-02T12:00:00.000", + "ram_quota": -1, + "net_weight": -1, + "cpu_weight": -1, + "net_limit": { + "used": -1, + "available": -1, + "max": -1 + }, + "cpu_limit": { + "used": -1, + "available": -1, + "max": -1 + }, + "ram_usage": 1279625, + "permissions": [{ + "perm_name": "active", + "parent": "owner", + "required_auth": { + "threshold": 1, + "keys": [{ + "key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", + "weight": 1 + } + ], + "accounts": [], + "waits": [] + } + },{ + "perm_name": "owner", + "parent": "", + "required_auth": { + "threshold": 1, + "keys": [{ + "key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", + "weight": 1 + } + ], + "accounts": [], + "waits": [] + } + } + ], + "total_resources": null, + "delegated_bandwidth": null, + "voter_info": { + "owner": "eosio", + "proxy": "", + "producers": [], + "staked": 0, + "last_vote_weight": "0.00000000000000000", + "proxied_vote_weight": "0.00000000000000000", + "is_proxy": 0, + "deferred_trx_id": 0, + "last_unstake_time": "1970-01-01T00:00:00", + "unstaking": "0.0000 SYS" + } +} +``` + +## См. также +- Протокольный документ [Accounts and Permissions](/protocol-guides/04_accounts_and_permissions.md). diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/accounts.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/accounts.md new file mode 100644 index 000000000..0231027cb --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/accounts.md @@ -0,0 +1,21 @@ +## Описание +Получить все аккаунты, связанные с указанным публичным ключом + +!!! note + Команда не возвращает привилегированные аккаунты. + +## Позиционные параметры +`public_key` _TEXT_ — публичный ключ для поиска аккаунтов +## Опции +- `-j,--json` — вывод в формате JSON +## Пример + + +```sh +cleos get accounts EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt +{ + "account_names": [ + "testaccount" + ] +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/actions.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/actions.md new file mode 100644 index 000000000..0a6c54df0 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/actions.md @@ -0,0 +1,32 @@ +## Описание +Получить действия, где заданный аккаунт указан в авторизации или как получатель + +## Позиционные параметры +- `account_name` _TEXT_ — аккаунт для запроса (обязательно) +- `pos` _INT_ — порядковый номер действия для этого аккаунта, -1 — последнее (необязательно) +- `offset` _INT_ — диапазон действий: при положительном offset — [pos, pos + offset], при отрицательном — [pos - offset, pos] + +## Опции + +- `-j,--json` — полный JSON +- `--full` — не обрезать вывод действия +- `--pretty` — форматировать полный JSON действия +- `--console` — вывести консольный вывод, сгенерированный действием + +## Примеры +Список действий для eosio.token + +```sh +cleos get actions eosio.token +``` +```console +# seq when contract::action => receiver trx id... args +================================================================================================================ +# 976 2018-06-01T19:54:05.000 eosio.token::transfer => eosio.token 1d1fe154... {"from":"userae","to":"useraa","quantity":"0.000... +# 977 2018-06-01T19:54:05.000 eosio.token::transfer => eosio.token a0c9e5bc... {"from":"userab","to":"useraa","quantity":"0.000... +# 978 2018-06-01T19:54:05.000 eosio.token::transfer => eosio.token 3749d0d1... {"from":"userab","to":"userah","quantity":"0.000... +# 979 2018-06-01T19:54:05.000 eosio.token::transfer => eosio.token dda205b0... {"from":"userai","to":"useraj","quantity":"0.000... +# 980 2018-06-01T19:54:05.000 eosio.token::transfer => eosio.token 14089e9b... {"from":"userab","to":"userae","quantity":"0.000... +# 981 2018-06-01T19:54:05.000 eosio.token::transfer => eosio.token 6882cefc... {"from":"useraj","to":"userab","quantity":"0.000... +... +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/block.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/block.md new file mode 100644 index 000000000..e5c2c2dc0 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/block.md @@ -0,0 +1,69 @@ +## Описание +Получить полный блок из блокчейна + +## Позиционные параметры +- `block` _TEXT_ — номер **или** id блока +## Опции +- `--header-state` — состояние заголовка блока из fork database +- `--info` — краткая информация о блоке только по номеру +## Пример + +### Полный блок: + +```sh +cleos get block 1 +``` +или +```sh +cleos get block 0000000130d70e94e0022fd2fa035cabb9e542c34ea27f572ac90b5a7aa3d891 +``` + +Вывод — объект блока, похожий на следующий: + +```json +{ + "timestamp": "2018-03-02T12:00:00.000", + "producer": "", + "confirmed": 1, + "previous": "0000000000000000000000000000000000000000000000000000000000000000", + "transaction_mroot": "0000000000000000000000000000000000000000000000000000000000000000", + "action_mroot": "0000000000000000000000000000000000000000000000000000000000000000", + "schedule_version": 0, + "new_producers": null, + "header_extensions": [], + "producer_signature": "SIG_K1_111111111111111111111111111111111111111111111111111111111111111116uk5ne", + "transactions": [], + "block_extensions": [], + "id": "0000000130d70e94e0022fd2fa035cabb9e542c34ea27f572ac90b5a7aa3d891", + "block_num": 1, + "ref_block_prefix": 3526296288 +} +``` + +### Информация о блоке: + +```sh +cleos get block --info 1 +``` + +Вывод — объект block info, похожий на следующий: + +```json +{ + "block_num": 1, + "ref_block_num": 1, + "id": "0000000130d70e94e0022fd2fa035cabb9e542c34ea27f572ac90b5a7aa3d891", + "timestamp": "2018-03-02T12:00:00.000", + "producer": "", + "confirmed": 1, + "previous": "0000000000000000000000000000000000000000000000000000000000000000", + "transaction_mroot": "0000000000000000000000000000000000000000000000000000000000000000", + "action_mroot": "0000000000000000000000000000000000000000000000000000000000000000", + "schedule_version": 0, + "producer_signature": "SIG_K1_111111111111111111111111111111111111111111111111111111111111111116uk5ne", + "ref_block_prefix": 3526296288 +} +``` + +## Примечания +Объект block info фиксированного размера и не содержит полей: new_producers, header_extensions, transactions, block_extensions. diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/code.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/code.md new file mode 100644 index 000000000..e015845ac --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/code.md @@ -0,0 +1,38 @@ +## Описание +Получить код и ABI аккаунта + +## Позиционные параметры +- `name` _TEXT_ — аккаунт, чей код нужно получить +## Опции +- `-c,--code` _TEXT_ — файл для сохранения контракта _.wast_ +- `-a,--abi` _TEXT_ — файл для сохранения контракта _.abi_ +- `--wasm` — сохранить контракт как wasm +## Примеры +Вывести только хэш кода контракта eosio.token + +```sh +cleos get code eosio.token +``` +```console +code hash: f675e7aeffbf562c033acfaf33eadff255dacb90d002db51c7ad7cbf057eb791 +``` + +Получить и сохранить ABI контракта eosio.token + +```sh +cleos get code eosio.token -a eosio.token.abi +``` +```console +code hash: f675e7aeffbf562c033acfaf33eadff255dacb90d002db51c7ad7cbf057eb791 +saving abi to eosio.token.abi +``` + +Получить и сохранить WAST контракта eosio.token + +```sh +cleos get code eosio.token -c eosio.token.wast +``` +```console +code hash: f675e7aeffbf562c033acfaf33eadff255dacb90d002db51c7ad7cbf057eb791 +saving wast to eosio.token.wast +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-balance.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-balance.md new file mode 100644 index 000000000..199e519c4 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-balance.md @@ -0,0 +1,23 @@ +## Описание + +Получить баланс аккаунта для заданной валюты + +## Позиционные параметры +`contract` _TEXT_ — контракт, управляющий валютой + +`account` _TEXT_ — аккаунт, по которому запрашиваются балансы + +`symbol` _TEXT_ — символ валюты, если контракт обслуживает несколько валют + +## Опции +У этой подкоманды нет опций + +## Пример +Баланс eosio у контракта eosio.token для символа SYS. + +```sh +cleos get currency balance eosio.token eosio SYS +``` +```console +999999920.0000 SYS +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-stats.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-stats.md new file mode 100644 index 000000000..295573e3c --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency-stats.md @@ -0,0 +1,24 @@ +## Описание +Получить статистику для заданной валюты + +## Позиционные параметры +`contract` _TEXT_ — контракт, управляющий валютой + +`symbol` _TEXT_ — символ валюты, если контракт обслуживает несколько валют +## Опции +У этой подкоманды нет опций +## Пример +Статистика токена SYS контракта eosio.token. + +```sh +cleos get currency stats eosio.token SYS +``` +```json +{ + "SYS": { + "supply": "1000000000.0000 SYS", + "max_supply": "10000000000.0000 SYS", + "issuer": "eosio" + } +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency.md new file mode 100644 index 000000000..2098de84f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/currency.md @@ -0,0 +1,8 @@ +## Описание + +Подкоманды для работы со стандартными валютами + +## Подкоманды +[currency balance](currency-balance.md) — баланс аккаунта для заданной валюты + +[currency stats](currency-stats.md) — статистика для заданной валюты diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/index.md new file mode 100644 index 000000000..daa5cd9af --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/index.md @@ -0,0 +1,19 @@ +## Описание + +Получить различные данные и сведения из блокчейна + +## Подкоманды +- [info](info.md) — текущая информация о блокчейне +- [block](block.md) — полный блок из блокчейна +- [account](account.md) — аккаунт из блокчейна +- [code](code.md) — код и ABI аккаунта +- [abi](abi.md) — ABI аккаунта +- [table](table.md) — содержимое таблицы БД +- [scope](scope.md) — список scope и таблиц контракта +- [currency](currency.md) — сведения о стандартных валютах +- [accounts](accounts.md) — аккаунты, связанные с публичным ключом +- [servants](servants.md) — аккаунты-подчинённые (servants) для заданного аккаунта +- [transaction](transaction.md) — транзакция из блокчейна +- [actions](actions.md) — действия, где в авторизации или у получателя указан заданный аккаунт +- [schedule](schedule.md) — расписание продюсеров +- [transaction_id](transaction_id.md) — id транзакции по объекту транзакции diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/info.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/info.md new file mode 100644 index 000000000..0ba48b668 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/info.md @@ -0,0 +1,29 @@ +## Описание + +Получить текущую информацию о блокчейне + +## Позиционные параметры +Параметры не принимаются. +## Опции +- `-h`, `--help` — вывести справку и выйти +## Пример + + +```sh +cleos get info +``` + +Команда возвращает текущее состояние блокчейна. + +```json +{ + "server_version": "7451e092", + "head_block_num": 6980, + "last_irreversible_block_num": 6963, + "head_block_id": "00001b4490e32b84861230871bb1c25fb8ee777153f4f82c5f3e4ca2b9877712", + "head_block_time": "2017-12-07T09:18:48", + "head_block_producer": "initp", + "recent_slots": "1111111111111111111111111111111111111111111111111111111111111111", + "participation_rate": "1.00000000000000000" +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/schedule.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/schedule.md new file mode 100644 index 000000000..701bf0917 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/schedule.md @@ -0,0 +1,29 @@ +## Описание + +Получить расписание продюсеров + + +## Опции +- `-h`, `--help` — вывести справку и выйти + +- `-j`, `--json` — вывод в формате JSON + + +## Пример + +```sh +cleos get schedule +``` + +Команда возвращает текущее расписание продюсеров. + +```console +active schedule version 0 + Producer Producer key + ============= ================== + eosio EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV + +pending schedule empty + +proposed schedule empty +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/scope.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/scope.md new file mode 100644 index 000000000..99523c042 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/scope.md @@ -0,0 +1,12 @@ +## Описание +Получить список scope и таблиц, принадлежащих контракту + +## Позиционные параметры +- `contract` _TEXT_ — владелец таблицы + +## Опции +- `-t,--table` _TEXT_ — фильтр по имени таблицы +- `-l,--limit` _UINT_ — максимальное число возвращаемых строк +- `-L,--lower` _TEXT_ — нижняя граница scope +- `-U,--upper` _TEXT_ — верхняя граница scope +- `-r,--reverse` — обход в обратном порядке diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/servants.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/servants.md new file mode 100644 index 000000000..df4d25b7c --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/servants.md @@ -0,0 +1,34 @@ +## Описание +Получить аккаунты-подчинённые (controlled) для заданного аккаунта + +## Сведения + +**Команда** + +```sh +cleos get servants +``` +**Вывод** + +```console +Usage: cleos get servants account + +Positionals: + account TEXT The name of the controlling account +``` + +## Команда + +```sh +cleos get servants inita +``` + +## Вывод + +```json +{ + "controlled_accounts": [ + "tester" + ] +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/table.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/table.md new file mode 100644 index 000000000..b3957749f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/table.md @@ -0,0 +1,47 @@ +## Описание + +Получить содержимое таблицы базы данных + +## Позиционные параметры +`account` _TEXT_ — аккаунт, на котором развёрнут смарт-контракт, владеющий таблицей + +`scope` _TEXT_ — scope внутри контракта, в котором находится таблица + +`table` _TEXT_ — имя таблицы по ABI контракта + +## Опции +`-l,--limit` _UINT_ — максимальное число возвращаемых строк + +`-k,--key` _TEXT_ — (устарело) имя ключа для индексации по ABI, по умолчанию первичный ключ + +`-L,--lower` _TEXT_ — JSON нижней границы ключа, по умолчанию первая запись + +`-U,--upper` _TEXT_ — JSON верхней границы ключа, по умолчанию последняя запись + +`--index` _TEXT_ — номер индекса: `1` — primary (первый), `2` — вторичный (в порядке multi_index), `3` — третий и т.д. Можно указать номер или имя индекса, например `secondary` или `2` + +`--key-type` _TEXT_ — тип ключа для `--index`; для primary только `i64`. Остальные поддерживают `i64`, `i128`, `i256`, `float64`, `float128`, `ripemd160`, `sha256`. Специальный тип `name` — имя аккаунта + +`--encode-type` _TEXT_ — кодировка для `--key_type`: `dec` для десятичного представления (`i[64|128|256]`, `float[64|128]`); `hex` для шестнадцатеричного (`i256`, `ripemd160`, `sha256`) + +`-b,--binary` _UINT_ — вернуть значение в BINARY без интерпретации ABI как JSON + +`-r,--reverse` — обход в обратном порядке + +`--show-payer` — показать плательщика RAM + +## Пример +Данные таблицы `accounts` контракта eosio.token для пользователя eosio, + +```sh +cleos get table eosio.token eosio accounts +``` +```json +{ + "rows": [{ + "balance": "999999920.0000 SYS" + } + ], + "more": false +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction-status.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction-status.md new file mode 100644 index 000000000..00d00c62f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction-status.md @@ -0,0 +1,38 @@ +## Описание + +Текущее состояние цепочки и при наличии — информация о статусе транзакции по её id. + +Для работы запроса должна быть включена функция статуса финальности транзакций: в плагине chain у `nodeos` задать опцию `--transaction-finality-status-max-storage-size-gb \`. + +## Позиционные параметры + +- `id` _TEXT_ — id транзакции для запроса статуса (обязательно) + +## Опции +- `-h`, `--help` — вывести справку и выйти +## Пример + + +```sh +cleos get transaction-status 6438df82216dfaf46978f703fb818b49110dbfc5d9b521b5d08c342277438b29 +``` + +Команда возвращает состояние цепочки и при наличии — статус транзакции. + +```json +{ + "state": "IN_BLOCK", + "block_number": 90, + "block_id": "0000005accfd59ba80a05380f60d51687406337b2aedd28b7daa33fdb8c16b5a", + "block_timestamp": "2022-04-27T16:11:26.500", + "expiration": "2022-04-27T16:11:56.000", + "head_number": 186, + "head_id": "000000bab27da51f76f483bb629b532510c22e2eb1acc632f5b37b421adecf63", + "head_timestamp": "2022-04-27T16:12:14.500", + "irreversible_number": 25, + "irreversible_id": "0000001922118216bc16bf2c60d950598d80af3beca820eab751f7beecdb29e4", + "irreversible_timestamp": "2022-04-27T16:10:54.000", + "earliest_tracked_block_id": "000000129cee97f3e27312f0184d52d006a470f0e620553dfb4c5b4f3c856ab2", + "earliest_tracked_block_number": 18 +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction.md new file mode 100644 index 000000000..44e571a65 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction.md @@ -0,0 +1,79 @@ +## Описание +Получить транзакцию из блокчейна + +## Позиционные параметры +`id` _TEXT_ — id запрашиваемой транзакции + +## Опции +`-b,--block-hint` UINT — номер блока, в котором транзакция может находиться + +**Команда** + +```sh +cleos get transaction +``` +**Вывод** + +## Пример + +```sh +cleos get transaction eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703 +``` +```json +{ + "transaction_id": "eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703", + "processed": { + "refBlockNum": 2206, + "refBlockPrefix": 221394282, + "expiration": "2017-09-05T08:03:58", + "scope": [ + "inita", + "tester" + ], + "signatures": [ + "1f22e64240e1e479eee6ccbbd79a29f1a6eb6020384b4cca1a958e7c708d3e562009ae6e60afac96f9a3b89d729a50cd5a7b5a7a647540ba1678831bf970e83312" + ], + "messages": [{ + "code": "eos", + "type": "transfer", + "authorization": [{ + "account": "inita", + "permission": "active" + } + ], + "data": { + "from": "inita", + "to": "tester", + "amount": 1000, + "memo": "" + }, + "hex_data": "000000008040934b00000000c84267a1e80300000000000000" + } + ], + "output": [{ + "notify": [{ + "name": "tester", + "output": { + "notify": [], + "sync_transactions": [], + "async_transactions": [] + } + },{ + "name": "inita", + "output": { + "notify": [], + "sync_transactions": [], + "async_transactions": [] + } + } + ], + "sync_transactions": [], + "async_transactions": [] + } + ] + } +} +``` + +!!! note "Важно" + Указанный id транзакции может отсутствовать в вашей цепочке diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction_id.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction_id.md new file mode 100644 index 000000000..277779a4f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/get/transaction_id.md @@ -0,0 +1,10 @@ +## Описание +Получить id транзакции по объекту транзакции + +## Позиционные параметры + +- `transaction` _TEXT_ — JSON-строка или файл с транзакцией, для которой нужен id (обязательно) + +## Опции + + `-h,--help` — вывести справку и выйти \ No newline at end of file diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/index.md new file mode 100644 index 000000000..142cc8c10 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/index.md @@ -0,0 +1,19 @@ +Документация по основным командам `cleos` + +## Команды +- [version](version) — сведения о версии +- [create](create) — создать различные сущности вне и в блокчейне +- [convert](convert) — упаковка и распаковка транзакций +- [get](get) — получить данные и сведения из блокчейна +- [set](set) — задать или обновить состояние блокчейна +- [transfer](transfer.md) — перевести токены с одного аккаунта на другой +- [net](net) — работа с локальными p2p-подключениями +- [wallet](wallet) — работа с локальным кошельком +- [sign](sign.md) — подписать транзакцию +- [push](push) — отправить произвольные транзакции в блокчейн +- [multisig](multisig) — команды контракта multisig + +[//]: # ( THIS IS A COMMENT FOLLOWING LINE HAD JS COMMENTS JS COMMENTS BREAK MDX ) +[//]: # ( wrap wrap - Wrap contract commands ) + +- [system](system) — отправить действие контракта eosio.system в блокчейн. diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/index.md new file mode 100644 index 000000000..132709f08 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/index.md @@ -0,0 +1,12 @@ +## Описание +Команды контракта multisig + +## Подкоманды +- [multisig propose](multisig-propose.md) — предложить транзакцию +- [multisig review](multisig-review.md) — просмотреть транзакцию +- [multisig approve](multisig-approve.md) — одобрить предложенную транзакцию +- [multisig unapprove](multisig-unapprove.md) — снять одобрение с предложенной транзакции + +- [multisig invalidate](multisig-invalidate.md) — аннулировать все одобрения multisig аккаунта +- [multisig cancel](multisig-cancel.md) — отменить предложенную транзакцию +- [multisig exec](multisig-exec.md) — выполнить предложенную транзакцию diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-approve.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-approve.md new file mode 100644 index 000000000..39ad71c9a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-approve.md @@ -0,0 +1,23 @@ +## Описание +Одобрить предложенную транзакцию + +## Позиционные аргументы +- `proposer` _TEXT_ — имя предлагающего (строка) +- `proposal_name` _TEXT_ — имя предложения (строка) +- `permissions` _TEXT_ — JSON-строка или файл с разрешениями одобрения +- `proposal_hash` _TEXT_ — хэш предложенной транзакции (например id транзакции) как необязательное условие одобрения + +## Опции + +- `-h,--help` — вывести справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +- `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +- `-j,--json` — вывести результат в JSON +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `account@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-cancel.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-cancel.md new file mode 100644 index 000000000..1c034f97a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-cancel.md @@ -0,0 +1,18 @@ +## Описание +Отменить предложенную транзакцию + +## Позиционные аргументы +- `proposer` _TEXT_ — имя предлагающего (строка) +- `proposal_name` _TEXT_ — имя предложения (строка) +- `canceler` _TEXT_ — имя отменяющего (строка) +## Опции +- `-h,--help` — вывести справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +- `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `account@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-exec.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-exec.md new file mode 100644 index 000000000..97a547158 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-exec.md @@ -0,0 +1,19 @@ +## Описание + +Выполнить предложенную транзакцию + +## Позиционные аргументы +- `proposer` _TEXT_ — имя предлагающего (строка) +- `proposal_name` _TEXT_ — имя предложения (строка) +- `executer` _TEXT_ — аккаунт, оплачивающий выполнение (строка) +## Опции +- `-h,--help` — вывести справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +- `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `account@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-invalidate.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-invalidate.md new file mode 100644 index 000000000..973a2d065 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-invalidate.md @@ -0,0 +1,19 @@ +## Описание +Аннулировать все одобрения multisig для аккаунта + +## Позиционные параметры: + invalidator TEXT имя аннулирующего (строка) (обязательно) + +## Опции: + - `-h,--help` — вывести справку и выйти + - `-x,--expiration` — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) + - `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции + - `-j,--json` — вывести результат в JSON + - `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию + - `-r,--ref-block` TEXT — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) + - `-p,--permission` TEXT ... — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `invalidator@active`) + - `--max-cpu-usage-ms` UINT — верхний предел миллисекунд бюджета CPU (0 — без ограничения) + - `--max-net-usage` UINT — верхний предел бюджета net в байтах (0 — без ограничения) + - `--delay-sec` UINT — задержка `delay_sec` в секундах, по умолчанию 0 diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose.md new file mode 100644 index 000000000..55e0b645a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose.md @@ -0,0 +1,23 @@ +## Описание +Предложить действие (action) + +## Позиционные аргументы +`proposal_name` _TEXT_ — имя предложения (строка) +`requested_permissions` _TEXT_ — JSON-строка или файл с запрашиваемыми разрешениями +`trx_permissions` _TEXT_ — JSON-строка или файл с разрешениями транзакции +`contract` _TEXT_ — контракт, которому должна быть доставлена отложенная транзакция +`action` _TEXT_ — действие отложенной транзакции +`data` _TEXT_ — JSON-строка или файл с данными предлагаемого действия +`proposer` _TEXT_ — аккаунт, предлагающий транзакцию +`proposal_expiration` _UINT_ — срок действия предложения в часах +## Опции +- `-h,--help` — вывести справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +- `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `account@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose_trx.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose_trx.md new file mode 100644 index 000000000..801849889 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-propose_trx.md @@ -0,0 +1,26 @@ +## Описание +Предложить транзакцию + +## Позиционные аргументы + +`proposal_name` _TEXT_ — имя предложения (строка) +`requested_permissions` _TEXT_ — JSON-строка или файл с запрашиваемыми разрешениями +`trx_permissions` _TEXT_ — JSON-строка или файл с разрешениями транзакции +`contract` _TEXT_ — контракт, которому должна быть доставлена отложенная транзакция +`action` _TEXT_ — действие отложенной транзакции +`data` _TEXT_ — JSON-строка или файл с данными предлагаемого действия +`proposer` _TEXT_ — аккаунт, предлагающий транзакцию +`proposal_expiration` _UINT_ — срок действия предложения в часах + +## Опции + +- `-h,--help` — вывести справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +- `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `account@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-review.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-review.md new file mode 100644 index 000000000..544fc4fa9 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-review.md @@ -0,0 +1,17 @@ +## Описание +Просмотреть транзакцию + +## Позиционные аргументы +- `proposer` _TEXT_ — имя предлагающего (строка) +- `proposal_name` _TEXT_ — имя предложения (строка) +## Опции +- `-h,--help` — вывести справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +- `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `account@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-unapprove.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-unapprove.md new file mode 100644 index 000000000..438590dfd --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/multisig/multisig-unapprove.md @@ -0,0 +1,20 @@ +## Описание +Снять одобрение с предложенной транзакции + +--- +## Позиционные аргументы +- `proposer` _TEXT_ — имя предлагающего (строка) +- `proposal_name` _TEXT_ — имя предложения (строка) +- `permissions` _TEXT_ — JSON-строка или файл с разрешениями одобрения +## Опции +- `-h,--help` — вывести справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +- `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — аккаунт и уровень разрешения в виде `account@permission` (по умолчанию `account@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/connect.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/connect.md new file mode 100644 index 000000000..1ddc2cb6d --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/connect.md @@ -0,0 +1,58 @@ +## Команда +```sh +cleos net connect [OPTIONS] host +``` + +**Где:** +* [OPTIONS] = см. раздел **Опции** (уточняется) + +[//]: # ( THIS IS A COMMENT LINK BELOW IS BROKEN ) +[//]: # (in the **Command Usage** command-usage section below.) + +* host — хост:порт для подключения + +**Примечание:** аргументы и опции в квадратных скобках необязательны. + +## Описание +Установить новое подключение к указанному пиру. Оператор узла может выполнить команду без перезапуска `nodeos`. + +## Использование команды +Позиционные параметры и опции `cleos net connect`: + +### Позиционные параметры +* `host` _TEXT_ ОБЯЗАТЕЛЬНО — хост:порт для подключения + +### Опции +* `-h,--help` — вывести справку и выйти + +## Требования + +* Установлена поддерживаемая версия `cleos`. +!!! note "Примечание" + `cleos` входит в состав COOPOS. [Установка COOPOS](../../../00_install/index.md) ставит `cleos` и `keosd`. +* Доступ к узлу с загруженным [`net_api_plugin`](../../../01_nodeos/03_plugins/net_api_plugin/index.md). + +## Примеры + +* Узел по умолчанию (`http://127.0.0.1:8888`) подключается к пиру `localhost:9002`: +```sh +cleos net connect localhost:9002 +``` +**Вывод:** +```console +"added connection" +``` + +* Узел `http://127.0.0.1:8001` подключается к пиру `localhost:9002`: +```sh +cleos -u http://127.0.0.1:8001 net connect localhost:9002 +``` +**Вывод:** +```console +"added connection" +``` + +**Примечание:** при повторном выполнении `cleos` ожидаемо выводит: +```console +"already connected" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/disconnect.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/disconnect.md new file mode 100644 index 000000000..bdc8efe2b --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/disconnect.md @@ -0,0 +1,56 @@ +## Команда +```sh +cleos net disconnect [OPTIONS] host +``` + +**Где:** +* [OPTIONS] = см. раздел **Опции** (уточняется) + +[//]: # ( THIS IS A COMMENT LINK BELOW IS BROKEN ) +[//]: # (in the **Command Usage** command-usage section below.) + +**Примечание:** аргументы и опции в квадратных скобках необязательны. + +## Описание +Закрыть существующее подключение к указанному пиру. Оператор узла может выполнить команду без перезапуска `nodeos`. + +## Использование команды +Позиционные параметры и опции `cleos net disconnect`: + +### Позиционные параметры +* `host` _TEXT_ ОБЯЗАТЕЛЬНО — хост:порт для отключения + +### Опции +* `-h,--help` — вывести справку и выйти + +## Требования + +* Установлена поддерживаемая версия `cleos`. +!!! note "Примечание" + `cleos` входит в состав COOPOS. [Установка COOPOS](../../../00_install/index.md) ставит `cleos` и `keosd`. +* Доступ к узлу с загруженным [`net_api_plugin`](../../../01_nodeos/03_plugins/net_api_plugin/index.md). + +## Примеры + +* Узел по умолчанию отключается от пира `localhost:9002`: +```sh +cleos net disconnect localhost:9002 +``` +**Вывод:** +```console +"connection removed" +``` + +* Узел `http://127.0.0.1:8001` отключается от пира `localhost:9002`: +```sh +cleos -u http://127.0.0.1:8001 net disconnect localhost:9002 +``` +**Вывод:** +```console +"connection removed" +``` + +**Примечание:** при повторном выполнении `cleos` ожидаемо выводит: +```console +"no known connection for host" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/index.md new file mode 100644 index 000000000..ef4799ab3 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/index.md @@ -0,0 +1,18 @@ +## Описание +Работа с локальными p2p-подключениями. + +## Команда + +```console +Usage: cleos net SUBCOMMAND +``` + +## Подкоманды + + - [cleos net connect](connect.md) — установить новое подключение к пиру + + - [cleos net disconnect](disconnect.md) — закрыть существующее подключение + + - [cleos net status](status.md) — статус существующего подключения + + - [cleos net peers](peers.md) — статус всех пиров diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/peers.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/peers.md new file mode 100644 index 000000000..4b538d7cd --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/peers.md @@ -0,0 +1,112 @@ +## Команда +```sh +cleos net peers [OPTIONS] +``` + +**Где:** +* [OPTIONS] = см. раздел **Опции** (уточняется) + +[//]: # (in the **Command Usage** command-usage section below.) + +**Примечание:** аргументы и опции в квадратных скобках необязательны. + +## Описание +Возвращает список со статусом всех peer-подключений. Позволяет оператору узла проверить состояние подключений. + +## Использование команды +Позиционные параметры и опции `cleos net peers`: + +### Позиционные параметры +* `host` _TEXT_ ОБЯЗАТЕЛЬНО — хост:порт для отключения + +### Опции +* `-h,--help` — вывести справку и выйти + +## Требования + +* Установлена поддерживаемая версия `cleos`. +!!! note "Примечание" + `cleos` входит в состав COOPOS. [Установка COOPOS](../../../00_install/index.md) ставит `cleos` и `keosd`. +* Доступ к узлу с загруженным [`net_api_plugin`](../../../01_nodeos/03_plugins/net_api_plugin/index.md). + +## Примеры + +* Статус всех пиров для узла `http://127.0.0.1:8001`: + +```sh +cleos -u http://127.0.0.1:8001 net peers +``` +**Вывод:** +```json +[{ + "peer": "", + "connecting": false, + "syncing": false, + "last_handshake": { + "network_version": 1210, + "chain_id": "60fb0eb4742886af8a0e147f4af6fd363e8e8d8f18bdf73a10ee0134fec1c551", + "node_id": "58ed23173cd4ed89ae90c2e65f5c29bb51e233e78d730d72220b6d84543bfc08", + "key": "EOS1111111111111111111111111111111114T1Anm", + "time": "1621013128445696000", + "token": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "SIG_K1_111111111111111111111111111111111111111111111111111111111111111116uk5ne", + "p2p_address": "127.0.0.1:9005 - 58ed231", + "last_irreversible_block_num": 127, + "last_irreversible_block_id": "0000007f97323fae098048ae41f22a99238afc5db56cad17f50304919d21e1c2", + "head_num": 128, + "head_id": "0000008072eb0fc043770e44a5db5dedfbd86db9aa5c41b28618f1b9343c2d22", + "os": "osx", + "agent": "EOS Test Agent", + "generation": 4 + } + },{ + "peer": "", + "connecting": false, + "syncing": false, + "last_handshake": { + "network_version": 1210, + "chain_id": "60fb0eb4742886af8a0e147f4af6fd363e8e8d8f18bdf73a10ee0134fec1c551", + "node_id": "2101bd8d770e8eabb3e69cb981db4350b494a04cd5b7a7cea0cd3070aa722306", + "key": "EOS1111111111111111111111111111111114T1Anm", + "time": "1621013129884873000", + "token": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "SIG_K1_111111111111111111111111111111111111111111111111111111111111111116uk5ne", + "p2p_address": "127.0.0.1:9017 - 2101bd8", + "last_irreversible_block_num": 129, + "last_irreversible_block_id": "0000008117074454dbaa7e8662c6f3d6918e776cc063c45f52b37bdc945ddc5d", + "head_num": 130, + "head_id": "0000008248cc3498b4bbf14a183711d9a73a36517a8069367a343bd4060fed14", + "os": "osx", + "agent": "EOS Test Agent", + "generation": 3 + } + },{ + + ... + + },{ + "peer": "", + "connecting": false, + "syncing": false, + "last_handshake": { + "network_version": 1210, + "chain_id": "60fb0eb4742886af8a0e147f4af6fd363e8e8d8f18bdf73a10ee0134fec1c551", + "node_id": "d9eb85085d09581521d0ec53b87a9657d0176c74fdf8657c56b09a91b3821c6f", + "key": "EOS1111111111111111111111111111111114T1Anm", + "time": "1621013127894327000", + "token": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "SIG_K1_111111111111111111111111111111111111111111111111111111111111111116uk5ne", + "p2p_address": "127.0.0.1:9002 - d9eb850", + "last_irreversible_block_num": 125, + "last_irreversible_block_id": "0000007d9a3b9cf6a61776ba1bbce226754aefcad664338d2acb5be34cc53a5b", + "head_num": 126, + "head_id": "0000007eccafd4f32a437b5fd8b111b326e2da8d0bcb832036984841b81ab64e", + "os": "osx", + "agent": "EOS Test Agent", + "generation": 4 + } + } +] +``` + +**Примечание:** поле `last_handshake` содержит состояние цепочки пира на момент последнего handshake с узлом. Подробнее — [Handshake Message](/protocol-guides/03_network_peer_protocol.md#421-handshake-message) в документе *Network Peer Protocol*. diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/status.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/status.md new file mode 100644 index 000000000..fb777b9a2 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/net/status.md @@ -0,0 +1,68 @@ +## Команда +```sh +cleos net status [OPTIONS] host +``` + +**Где:** +* [OPTIONS] = см. раздел **Опции** (уточняется) + +[//]: # ( THIS IS A COMMENT LINK BELOW IS BROKEN ) +[//]: # (in the **Command Usage** command-usage section below.) + +* host — хост:порт подключения для запроса статуса + +**Примечание:** аргументы и опции в квадратных скобках необязательны. + +## Описание +Возвращает статус подключённого пира. Позволяет оператору узла проверить состояние конкретного пира. + +## Использование команды +Позиционные параметры и опции `cleos net status`: + +### Позиционные параметры +* `host` _TEXT_ ОБЯЗАТЕЛЬНО — хост:порт подключения для запроса статуса + +### Опции +* `-h,--help` — вывести справку и выйти + +## Требования + +* Установлена поддерживаемая версия `cleos`. +!!! note "Примечание" + `cleos` входит в состав COOPOS. [Установка COOPOS](../../../00_install/index.md) ставит `cleos` и `keosd`. +* Доступ к узлу с загруженным [`net_api_plugin`](../../../01_nodeos/03_plugins/net_api_plugin/index.md). + +## Примеры + +* Статус пира `localhost:9001` для узла `http://127.0.0.1:8002`: + +```sh +cleos -u http://127.0.0.1:8002 net status localhost:9001 +``` +**Вывод:** +```json +{ + "peer": "localhost:9001", + "connecting": false, + "syncing": false, + "last_handshake": { + "network_version": 1210, + "chain_id": "60fb0eb4742886af8a0e147f4af6fd363e8e8d8f18bdf73a10ee0134fec1c551", + "node_id": "7432b032b50a5a3b04a220c48d75f12e5a089405dfee578c3e5b4cf46865e86e", + "key": "EOS1111111111111111111111111111111114T1Anm", + "time": "1620935866018960000", + "token": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "SIG_K1_111111111111111111111111111111111111111111111111111111111111111116uk5ne", + "p2p_address": "127.0.0.1:9001 - 7432b03", + "last_irreversible_block_num": 184, + "last_irreversible_block_id": "000000b899bd9462ac4697b5d265e47ef5d88d5a66a24a1c2d37de7974fe32f5", + "head_num": 185, + "head_id": "000000b9f79e2394a48738fb3c8c87dac944094648c23818427e1d44375b6034", + "os": "osx", + "agent": "EOS Test Agent", + "generation": 1 + } +} +``` + +**Примечание:** поле `last_handshake` содержит состояние цепочки указанного пира на момент последнего handshake с узлом. Подробнее — [Handshake Message](/protocol-guides/03_network_peer_protocol.md#421-handshake-message) в документе *Network Peer Protocol*. diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/index.md new file mode 100644 index 000000000..2037e7207 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/index.md @@ -0,0 +1,10 @@ +## Описание +Отправить произвольные транзакции в блокчейн. + +## Команды + +[push action](push-action.md) — транзакция с одним действием + +[push transaction](push-transaction.md) — произвольная JSON-транзакция + +[push transactions](push-transactions.md) — массив произвольных JSON-транзакций diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-action.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-action.md new file mode 100644 index 000000000..5f0c04186 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-action.md @@ -0,0 +1,47 @@ +## Описание +Отправить транзакцию с одним действием + +## Позиционные параметры + `contract` _Type: Text_ — аккаунт с контрактом для выполнения + + `action` _Type: Text_ — действие контракта + + `data` _Type: Text_ — аргументы контракта + +**Вывод** + +## Опции + +` -h,--help` — вывести справку и выйти + +`-x,--expiration` — время в секундах до истечения транзакции, по умолчанию 30 с + +`-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) + +` -s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции + +`-j,--json` — вывести результат в JSON + +`-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) + +`--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию + +`-r,--ref-block` — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) + +`--use-old-rpc` — использовать старый RPC `push_transaction` вместо нового `send_transaction` + +`--use-old-send-rpc` — использовать старый RPC `send_transaction` вместо нового `/v1/chain/send_transaction2` + +`-p,--permission` _Type: Text_ — аккаунт и уровень разрешения в виде `account@permission` + +`--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) + +`--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) + +`--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 + +`-t,--return-failure-trace` — при ошибке транзакции вернуть частичные трассы + +`--retry-irreversible` — просить узел повторять до необратимости или истечения (блокирующий вызов) + +`--retry-num-blocks` — просить узел повторять до попадания в блок заданной высоты (блокирующий вызов) diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transaction.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transaction.md new file mode 100644 index 000000000..9b1afd268 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transaction.md @@ -0,0 +1,52 @@ +## Описание + +Отправить произвольную JSON-транзакцию + +## Позиционные параметры +- `transaction` (text) JSON транзакции для отправки или имя JSON-файла с транзакцией + +## Опции +Отдельных опций у команды нет (см. ниже стандартные флаги cleos). + +` -h,--help` — вывести справку и выйти + +`-x,--expiration` — время в секундах до истечения транзакции, по умолчанию 30 с + +`-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) + +` -s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции + +`-j,--json` — вывести результат в JSON + +`-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) + +`--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию + +`-r,--ref-block` — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) + +`--use-old-rpc` — использовать старый RPC `push_transaction` вместо нового `send_transaction` + +`--use-old-send-rpc` — использовать старый RPC `send_transaction` вместо нового `/v1/chain/send_transaction2` + +`-p,--permission` _Type: Text_ — аккаунт и уровень разрешения в виде `account@permission` + +`--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU (0 — без ограничения) + +`--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) + +`--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 + +`-t,--return-failure-trace` — при ошибке транзакции вернуть частичные трассы + +`--retry-irreversible` — просить узел повторять до необратимости или истечения (блокирующий вызов) + +`--retry-num-blocks` — просить узел повторять до попадания в блок заданной высоты (блокирующий вызов) + +`-o,--read-only` — указать транзакцию как только для чтения + +## Пример + + +```sh +cleos push transaction {} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transactions.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transactions.md new file mode 100644 index 000000000..91bc2ed6f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/push/push-transactions.md @@ -0,0 +1,8 @@ +## Описание +Отправить массив произвольных JSON-транзакций + +## Позиционные аргументы +Отправляет массив произвольных JSON-транзакций. +## Опции +Отдельных опций нет +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/index.md new file mode 100644 index 000000000..bb0355d48 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/index.md @@ -0,0 +1,20 @@ +## Описание +Задать или обновить состояние блокчейна. +## Команды + +Задать или обновить состояние блокчейна + +```console +Usage: cleos set [OPTIONS] SUBCOMMAND + +Options: + -h,--help Print this help message and exit +``` + +## Подкоманды + +- [code](set-code.md) — создать или обновить код на аккаунте +- [abi](set-abi.md) — создать или обновить ABI на аккаунте +- [contract](set-contract.md) — создать или обновить контракт на аккаунте +- [account](set-account.md) — задать или обновить состояние аккаунта +- [action](set-action.md) — задать или обновить состояние действия diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-abi.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-abi.md new file mode 100644 index 000000000..1e992e430 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-abi.md @@ -0,0 +1,24 @@ +## Описание +Создать или обновить ABI на аккаунте + +## Позиционные параметры +* `account` _TEXT_ — аккаунт, для которого задаётся код (обязательно) +* `abi-file` _TEXT_ — полный путь к файлу контракта WAST или WASM (обязательно) + +## Опции +* `-h,--help` — вывести справку и выйти +* `-a,--abi' _TEXT_ — ABI контракта +* `-x,--expiration _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с +* `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) +* `-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции +* `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +* `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +* `-p,--permission` _TEXT_ — аккаунт и уровень разрешения для авторизации в виде `account@permission` (по умолчанию `account@active`) +* `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU на выполнение транзакции (0 — без ограничения) +* `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +* `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 с +## Использование + +```sh +cleos set abi someaccount1 ./path/to/abi.abi +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-account.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-account.md new file mode 100644 index 000000000..5de103c0f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-account.md @@ -0,0 +1,91 @@ +## Описание +Задать параметры, связанные с разрешениями аккаунта + +!!! note "Ввод JSON" + Команда требует JSON, зависящий от внутренних определений классов. Такой ввод может меняться в будущих версиях ПО COOPOS. + +## Позиционные параметры +- `account` _TEXT_ — аккаунт, для которого задаётся или удаляется полномочие разрешения +- `permission` _TEXT_ — имя разрешения, для которого задаётся или удаляется полномочие +- `authority` _TEXT_ — [delete] NULL, [create/update] публичный ключ, JSON-строка или файл с описанием полномочия +- `parent` _TEXT_ — [create] имя родительского разрешения (по умолчанию: `active`) +## Опции + +`-h,--help` — вывести справку и выйти + +`--add-code` [code] — добавить разрешение `eosio.code` к указанному полномочию + +`--remove-code` [code] — убрать разрешение `eosio.code` из указанного полномочия + +`-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с + +`-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) + +`-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции + +`-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) + +`-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) + +`-p,--permission` _TEXT_ — аккаунт и уровень разрешения для авторизации в виде `account@permission` (по умолчанию `account@active`) + +`--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU на выполнение транзакции (0 — без ограничения) + +`--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) + +`--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 с + +## Команда +Чтобы менять разрешения аккаунта, нужны полномочия на этот аккаунт и на изменяемое разрешение. + +Первый пример связывает новый ключ с разрешением `active` аккаунта. + +```sh +cleos set account permission test active '{"threshold":1,"keys":[{"key":"EOS8X7Mp7apQWtL6T2sfSZzBcQNUqZB7tARFEm9gA9Tn9nbMdsvBB","weight":1}],"accounts":[{"permission":{"actor":"acc2","permission":"active"},"weight":50}]}' owner +``` +Во втором примере то же разрешение меняется: ключ из предыдущего примера убирается, а разрешение `active` аккаунта `test` делегируется другому аккаунту. + +```sh +cleos set account permission test active '{"threshold":1,"keys":[],"accounts":[{"permission":{"actor":"acc1","permission":"active"},"weight":50},{"permission":{"actor":"sandwich","permission":"active"},"weight":1}]}' owner +``` + +Третий пример показывает настройку разрешений для multisig. + +```sh +cleos set account permission test active '{"threshold" : 100, "keys" : [{"key":"EOS8X7Mp7apQWtL6T2sfSZzBcQNUqZB7tARFEm9gA9Tn9nbMdsvBB","weight":25}], "accounts" : [{"permission":{"actor":"sandwich","permission":"active"},"weight":75}]}' owner +``` +JSON-объект в этой команде состоит из двух типов объектов. + +Объект полномочия (authority) … + +```json +{ + "threshold" : 100, /*целое: суммарный вес подписей, необходимый для авторизации*/ + "keys" : [], /*массив отдельных разрешений, заданных публичным ключом EOS*/ + "accounts" : [] /*массив отдельных разрешений, заданных аккаунтом EOS*/ +} +``` +…в который входят один или несколько объектов разрешения. + +```json +/*Разрешение по ключу*/ +{ + "permission" : { + "key" : "EOS8X7Mp7apQWtL6T2sfSZzBcQNUqZB7tARFEm9gA9Tn9nbMdsvBB", + "permission" : "active" + }, + weight : 25 /*вес подписи с этого разрешения*/ +} + +/*Разрешение по аккаунту*/ +{ + "permission" : { + "account" : "sandwich", + "permission" : "active" + }, + weight : 75 /*вес подписи с этого разрешения*/ +} +``` + +## См. также +- Протокольный документ [Accounts and Permissions](/protocol-guides/04_accounts_and_permissions.md). diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-action.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-action.md new file mode 100644 index 000000000..591c185f0 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-action.md @@ -0,0 +1,72 @@ +## Описание +Задать или обновить состояние действия в блокчейне. + +**Команда** + +```sh +cleos set action +``` +**Вывод** + +```console +Usage: cleos set action [OPTIONS] SUBCOMMAND + +Options: + -h,--help Print this help message and exit + +Subcommands: + permission set parmaters dealing with account permissions +``` +**Команда** + +```sh +cleos set action permission +``` + +## Позиционные параметры + +`account` TEXT — аккаунт, для которого задаётся или удаляется полномочие разрешения (обязательно) + +`code` _Text_ — аккаунт, которому принадлежит код действия + +`type` _Type_ — тип действия + +`requirement` _Type_ — имя разрешения, требуемого для выполнения данного действия + +## Опции +`-h,--help` — вывести справку и выйти + +`-x,--expiration` _Type:Text_ — время в секундах до истечения транзакции, по умолчанию 30 с + +`-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) + +`-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции + +`-j,--json` — вывести результат в JSON + +`-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) + +`--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию + +`-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) + +`-p,--permission` _Type:Text_ — аккаунт и уровень разрешения для авторизации в виде `account@permission` (по умолчанию `account@active`) + +`--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU на выполнение транзакции (0 — без ограничения) + +`--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) + +`--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 с + +## Использование + +```sh +# Связать действие `voteproducer` с разрешением `voting` +cleos set action permission sandwichfarm eosio.system voteproducer voting -p sandwichfarm@voting + +# Теперь транзакцию можно выполнить с ранее заданными разрешениями. +cleos system voteproducer approve sandwichfarm someproducer -p sandwichfarm@voting +``` + +## См. также +- Протокольный документ [Accounts and Permissions](/protocol-guides/04_accounts_and_permissions.md). diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-code.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-code.md new file mode 100644 index 000000000..61b896df1 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-code.md @@ -0,0 +1,42 @@ +## Описание +Задать или обновить код аккаунта в блокчейне. + +## Позиционные параметры + +* `account` _TEXT_ — аккаунт, для которого задаётся код (обязательно) +* `code-file` _TEXT_ — полный путь к файлу контракта WAST или WASM (обязательно) + +## Опции + +`-h,--help` — вывести справку и выйти +`-a,--abi` _TEXT_ — ABI контракта + +`-c,--clear` — удалить контракт с аккаунта + +`--suppress-duplicate-check` — не проверять дубликаты + +`-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с + +`-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) + +`-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции + +`-j,--json` — вывести результат в JSON + +`-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) + +`--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию + +`-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) + +`-p,--permission` _Type:Text_ — аккаунт и уровень разрешения для авторизации в виде `account@permission` (по умолчанию `account@active`) + +* `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +* `-p,--permission` _TEXT_ — аккаунт и уровень разрешения для авторизации в виде `account@permission` (по умолчанию `account@active`) +* `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU на выполнение транзакции (0 — без ограничения) +* `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +* `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 с + +```sh +cleos set code someaccount1 ./path/to/wasm +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-contract.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-contract.md new file mode 100644 index 000000000..8dd91dc36 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/set/set-contract.md @@ -0,0 +1,81 @@ +## Описание +Создать или обновить контракт на аккаунте. +## Позиционные параметры + `account` _TEXT_ — аккаунт, для которого публикуется контракт + `wast-file` _TEXT_ — файл с контрактом WAST или WASM + `abi-file` _TEXT_ — ABI контракта +## Опции + +`-h,--help` — вывести справку и выйти + +`-a,--abi` _TEXT_ — ABI контракта + +`-c,--clear` — удалить контракт с аккаунта + +`--suppress-duplicate-check` — не проверять дубликаты + +`-x,--expiration` _TEXT_ — время в секундах до истечения транзакции, по умолчанию 30 с + +`-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки) + +`-s,--skip-sign` — использовать ли ключи разблокированного кошелька для подписи транзакции + +`-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) + +`--return-packed` — вместе с `--dont-broadcast` получить упакованную транзакцию + +`-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) + +`-p,--permission` _TEXT_ — аккаунт и уровень разрешения для авторизации в виде `account@permission` (по умолчанию `account@active`) + +`--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU на выполнение транзакции (0 — без ограничения) + +`--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) + +`--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 с + +## Пример +Развёртывание стандартного контракта валюты. + +```sh +cleos set contract currency ../../../contracts/currency/currency.wast ../../../contracts/currency/currency.abi +``` +Вывод может быть примерно таким: + +```console +Reading WAST... +Assembling WASM... +Publishing contract... +``` +```json +{ + "transaction_id": "9990306e13f630a9c5436a5a0b6fb8fe2c7f3da2f342b4898a39c4a2c17dcdb3", + "processed": { + "refBlockNum": 1208, + "refBlockPrefix": 3058534156, + "expiration": "2017-08-24T18:29:52", + "scope": [ + "currency", + "eos" + ], + "signatures": [], + "messages": [{ + "code": "eos", + "type": "setcode", + "authorization": [{ + "account": "currency", + "permission": "active" + } + ], + "data": "00000079b822651d0000e8150061736d0100000001390a60017e0060037e7e7f017f60047e7e7f7f017f60017f0060057e7e7e7f7f017f60027f7f0060027f7f017f60027e7f0060000060027e7e00029d010a03656e7606617373657274000503656e76086c6f61645f693634000403656e76067072696e7469000003656e76067072696e746e000003656e76067072696e7473000303656e760b726561644d657373616765000603656e760a72656d6f76655f693634000103656e760b7265717569726541757468000003656e760d726571756972654e6f74696365000003656e760973746f72655f6936340002030706000007030809040401700000050301000107cc0107066d656d6f72790200205f5a4e33656f733133726571756972654e6f74696365454e535f344e616d6545000a1e5f5a4e33656f7331317265717569726541757468454e535f344e616d6545000b345f5a4e3863757272656e6379313273746f72654163636f756e74454e33656f73344e616d6545524b4e535f374163636f756e7445000c355f5a4e3863757272656e637932336170706c795f63757272656e63795f7472616e7366657245524b4e535f385472616e7366657245000d04696e6974000e056170706c79000f0a9d0d060600200010080b0600200010070b3400024020012903084200510d0020004280808080a8d7bee3082001411010091a0f0b20004280808080a8d7bee308200110061a0b8a0604017e027f047e017f4100410028020441206b2208360204200029030821052000290300210720002903102104411010042004100241c000100442808080c887d7c8b21d100341d00010042007100341e000100420051003200029030021052000290308100820051008200029030010072000290300210142002105423b210441f00021034200210603400240024002400240024020054206560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b2007421f83200442ffffffff0f838621070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b420021052008420037031820082006370310200142808080c887d7c8b21d4280808080a8d7bee308200841106a411010011a200041086a2903002101423b210441f00021034200210603400240024002400240024020054206560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b2007421f83200442ffffffff0f838621070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b2008200637030020084200370308200142808080c887d7c8b21d4280808080a8d7bee3082008411010011a200841186a2203290300200041106a22022903005a418001100020032003290300200229030022057d370300200520082903087c20055a41b00110002008200829030820022903007c370308200029030021050240024020032903004200510d0020054280808080a8d7bee308200841106a411010091a0c010b20054280808080a8d7bee308200841106a10061a0b200041086a290300210502400240200841086a2903004200510d0020054280808080a8d7bee3082008411010091a0c010b20054280808080a8d7bee308200810061a0b4100200841206a3602040b980303027f057e017f4100410028020441106b220736020442002103423b210241e00121014200210403400240024002400240024020034207560d0020012c00002200419f7f6a41ff017141194b0d01200041a0016a21000c020b420021052003420b580d020c030b200041ea016a41002000414f6a41ff01714105491b21000b2000ad42388642388721050b2005421f83200242ffffffff0f838621050b200141016a2101200342017c2103200520048421042002427b7c2202427a520d000b42002103423b210241f00021014200210603400240024002400240024020034206560d0020012c00002200419f7f6a41ff017141194b0d01200041a0016a21000c020b420021052003420b580d020c030b200041ea016a41002000414f6a41ff01714105491b21000b2000ad42388642388721050b2005421f83200242ffffffff0f838621050b200141016a2101200342017c2103200520068421062002427b7c2202427a520d000b2007428094ebdc033703082007200637030020044280808080a8d7bee3082007411010091a4100200741106a3602040bb10303027f047e017f4100410028020441206b220836020442002105423b210441e00121034200210603400240024002400240024020054207560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b2007421f83200442ffffffff0f838621070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b024020062000520d0042002105423b210441f00121034200210603400240024002400240024020054207560d0020032c00002202419f7f6a41ff017141194b0d01200241a0016a21020c020b420021072005420b580d020c030b200241ea016a41002002414f6a41ff01714105491b21020b2002ad42388642388721070b200341016a2103200542017c2105200720068421062004427b7c2204427a520d000b20062001520d00200842003703102008420037030820084200370318200841086a4118100541174b4180021000200841086a100d0b4100200841206a3602040b0bff010b0041040b04200500000041100b2254686973206170706561727320746f2062652061207472616e73666572206f6620000041c0000b0220000041d0000b072066726f6d20000041e0000b0520746f20000041f0000b086163636f756e7400004180010b2c696e746567657220756e646572666c6f77207375627472616374696e6720746f6b656e2062616c616e6365000041b0010b26696e7465676572206f766572666c6f7720616464696e6720746f6b656e2062616c616e6365000041e0010b0963757272656e6379000041f0010b097472616e7366657200004180020b1e6d6573736167652073686f72746572207468616e2065787065637465640000fd02046e616d651006617373657274020000086c6f61645f693634050000000000067072696e74690100067072696e746e0100067072696e747301000b726561644d6573736167650200000a72656d6f76655f693634030000000b726571756972654175746801000d726571756972654e6f7469636501000973746f72655f6936340400000000205f5a4e33656f733133726571756972654e6f74696365454e535f344e616d65450101301e5f5a4e33656f7331317265717569726541757468454e535f344e616d6545010130345f5a4e3863757272656e6379313273746f72654163636f756e74454e33656f73344e616d6545524b4e535f374163636f756e74450201300131355f5a4e3863757272656e637932336170706c795f63757272656e63795f7472616e7366657245524b4e535f385472616e73666572450901300131013201330134013501360137013804696e69740801300131013201330134013501360137056170706c7909013001310132013301340135013601370138010b4163636f756e744e616d65044e616d6502087472616e7366657200030466726f6d0b4163636f756e744e616d6502746f0b4163636f756e744e616d65087175616e746974790655496e743634076163636f756e740002036b65790655496e7436340762616c616e63650655496e74363401000000b298e982a4087472616e736665720100000080bafac608076163636f756e74" + } + ], + "output": [{ + "notify": [], + "sync_transactions": [], + "async_transactions": [] + } + ] + } +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/sign.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/sign.md new file mode 100644 index 000000000..e05482ae1 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/sign.md @@ -0,0 +1,16 @@ +## Описание +Подписать транзакцию + +## Использование +```sh +cleos sign [OPTIONS] transaction +``` + +## Позиционные параметры +- `transaction` _TEXT_ — JSON-строка или имя файла с описанием транзакции для подписи + +## Опции +- `-k,--private-key` _TEXT_ — приватный ключ для подписи транзакции +- `--public-key` _TEXT_ — попросить `keosd` подписать соответствующим приватным ключом для указанного публичного ключа +- `-c,--chain-id` _TEXT_ — идентификатор сети (chain id) для подписи +- `-p,--push-transaction` — после подписи отправить транзакцию в сеть diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/index.md new file mode 100644 index 000000000..ed429d527 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/index.md @@ -0,0 +1,23 @@ +## Описание + +Отправить действие контракта eosio.system в блокчейн. + +## Подкоманды + +- [system newaccount](system-newaccount.md) — создать новую учётную запись в блокчейне с начальными ресурсами +- [system regproducer](system-regproducer.md) — зарегистрировать нового продюсера +- [system unregprod](system-unregprod.md) — снять регистрацию существующего продюсера +- [system voteproducer](system-voteproducer.md) — голосовать за продюсера +- [system listproducers](system-listproducers.md) — список продюсеров +- [system delegatebw](system-delegatebw.md) — делегировать пропускную способность +- [system undelegatebw](system-undelegatebw.md) — отменить делегирование пропускной способности +- [system listbw](system-listbw.md) — список делегированной пропускной способности +- [system bidname](system-bidname.md) — торги за имена +- [system bidnameinfo](system-bidnameinfo.md) — сведения о торгах за имя +- [system buyram](system-buyram.md) — купить RAM +- [system sellram](system-sellram.md) — продать RAM +- [system claimrewards](system-claimrewards.md) — получить награды продюсера +- [system regproxy](system-regproxy.md) — зарегистрировать учётную запись как прокси (для голосования) +- [system unregproxy](system-unregproxy.md) — снять регистрацию учётной записи как прокси (для голосования) +- [system canceldelay](system-canceldelay.md) — отменить отложенную транзакцию +- [system rex](system-rex.md) — действия, связанные с REX (биржа ресурсов) diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidname.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidname.md new file mode 100644 index 000000000..38f47b672 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidname.md @@ -0,0 +1,30 @@ +## Описание + +Сделать ставку на «премиальные» имена пользователей (имена учётных записей короче 12 символов). + +## Позиционные аргументы + +* `bidder` _TEXT_ — учётная запись, делающая ставку (обязательно) +* `newname` _TEXT_ — имя, на которое делается ставка (обязательно) +* `bid` _TEXT_ — сумма в базовом символе сети для ставки (обязательно) + +## Опции + +* `-h,--help` — показать справку и выйти +* `-x,--expiration` — время в секундах до истечения транзакции; по умолчанию 30 с +* `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +* `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +* `-j,--json` — вывести результат в формате JSON +* `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +* `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +* `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» +* `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +* `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с + +## Использование + + +```sh +cleos system bidname accountname1 bob "10 SYS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidnameinfo.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidnameinfo.md new file mode 100644 index 000000000..924e1f13c --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-bidnameinfo.md @@ -0,0 +1,18 @@ +## Описание + +Возвращает данные об имени и статусе торгов за него. + +## Позиционные аргументы + +* `name` _TEXT_ — имя для запроса + +## Опции + +* `-h,--help` — показать справку и выйти +* `-j,--json` — вывести результат в формате JSON + +## Использование + +```sh +cleos system bidnameinfo bob +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-buyram.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-buyram.md new file mode 100644 index 000000000..87d392ce2 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-buyram.md @@ -0,0 +1,25 @@ +## Описание + +Купить RAM. + +## Позиционные аргументы + +- `payer` _TEXT_ — учётная запись, оплачивающая RAM +- `receiver` _TEXT_ — учётная запись, получающая купленную RAM +- `amount` _TEXT_ — сумма EOS за покупку RAM + +## Опции + +- `-h,--help` — показать справку и выйти +- `-k,--kbytes` — покупка RAM в кибибайтах (KiB) +- `-b,--bytes` — покупка RAM в байтах +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-j,--json` — вывести результат в формате JSON +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-canceldelay.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-canceldelay.md new file mode 100644 index 000000000..38e7769a8 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-canceldelay.md @@ -0,0 +1,23 @@ +## Описание + +Отменить отложенную транзакцию. + +## Позиционные аргументы + +- `canceling_account` _TEXT_ — учётная запись из авторизации исходной отложенной транзакции +- `canceling_permission` _TEXT_ — разрешение из авторизации исходной отложенной транзакции +- `trx_id` _TEXT_ — идентификатор исходной отложенной транзакции + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-claimrewards.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-claimrewards.md new file mode 100644 index 000000000..860d4004f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-claimrewards.md @@ -0,0 +1,23 @@ +## Описание + +Получить награды продюсера. + +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись, для которой забираются награды + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-delegatebw.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-delegatebw.md new file mode 100644 index 000000000..6b0df7e5c --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-delegatebw.md @@ -0,0 +1,26 @@ +--- +title: "system delegatebw" +excerpt: "Делегировать пропускную способность" +--- +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, с которой делегируется пропускная способность +- `receiver` _TEXT_ — учётная запись, которой делегируется пропускная способность +- `stake_net_quantity` _TEXT_ — сумма EOS, делегируемая на сетевую пропускную способность +- `stake_cpu_quantity` _TEXT_ — сумма EOS, делегируемая на CPU + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listbw.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listbw.md new file mode 100644 index 000000000..331eeb18b --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listbw.md @@ -0,0 +1,14 @@ +## Описание + +Список делегированной пропускной способности. + +## Позиционные аргументы + +- `account` _TEXT_ — учётная запись с делегированной пропускной способностью + +## Опции + +`-j,--json` — вывод в формате JSON +`-h,--help` — показать справку и выйти + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listproducers.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listproducers.md new file mode 100644 index 000000000..55891bdd2 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-listproducers.md @@ -0,0 +1,12 @@ +## Описание + +Список продюсеров. + +## Позиционные аргументы + +## Опции + +`-h,--help` — показать справку и выйти +`-j,--json` — вывод в формате JSON +`-l,--limit` _UINT_ — максимальное число возвращаемых строк +`-L,--lower` _TEXT_ — нижняя граница ключа; по умолчанию первая diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-newaccount.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-newaccount.md new file mode 100644 index 000000000..b0f4bcd94 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-newaccount.md @@ -0,0 +1,31 @@ +## Описание + +Создать учётную запись, купить RAM и застейкать пропускную способность для неё. + +## Позиционные аргументы + +- `creator` _TEXT_ — имя учётной записи, создающей новую +- `name` _TEXT_ — имя новой учётной записи +- `OwnerKey` _TEXT_ — публичный ключ owner для новой учётной записи +- `ActiveKey` _TEXT_ — публичный ключ active для новой учётной записи + +## Опции + +- `-h,--help` — показать справку и выйти +- `--stake-net` _TEXT_ — сумма EOS, делегируемая на сетевую пропускную способность +- `--stake-cpu` _TEXT_ — сумма EOS, делегируемая на CPU +- `--buy-ram-bytes` _UINT_ — объём RAM в байтах для покупки новой учётной записи в кибибайтах (KiB); по умолчанию 8 KiB +- `--buy-ram-EOS` _TEXT_ — сумма EOS на покупку RAM для новой учётной записи +- `--transfer` — передать получателю право голоса и право анстейкать EOS +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproducer.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproducer.md new file mode 100644 index 000000000..678c402f5 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproducer.md @@ -0,0 +1,25 @@ +--- +title: "system regproducer" +excerpt: "Зарегистрировать нового продюсера" +--- +## Позиционные аргументы + +- `account` _TEXT_ — учётная запись для регистрации в качестве продюсера +- `producer_key` _TEXT_ — публичный ключ продюсера +- `url` _TEXT_ — URL с информацией о продюсере +- `location` _UINT_ — относительное местоположение для планирования ближайших соседей + +## Опции + +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproxy.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproxy.md new file mode 100644 index 000000000..2f19c795f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-regproxy.md @@ -0,0 +1,23 @@ +--- +title: "system regproxy" +excerpt: "Зарегистрировать учётную запись как прокси (для голосования)" +--- +## Позиционные аргументы + +`proxy` _TEXT_ — учётная запись прокси для регистрации + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-buyrex.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-buyrex.md new file mode 100644 index 000000000..52d5e4158 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-buyrex.md @@ -0,0 +1,29 @@ +--- +title: "system rex buyrex" +excerpt: "Купить REX за токены из REX-фонда владельца" +--- +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, покупающая REX (обязательно) +- `amount` _TEXT_ — сумма, списываемая из REX-фонда на покупку REX (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex buyrex accountname1 "1 REX" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-cancelrexorder.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-cancelrexorder.md new file mode 100644 index 000000000..9676cf15b --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-cancelrexorder.md @@ -0,0 +1,28 @@ +--- +title: "system rex cancelrexorder" +excerpt: "Отменить отложенный ордер на продажу REX, если он есть" +--- +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца ордера на продажу (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex cancelrexorder accountname1 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-closerex.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-closerex.md new file mode 100644 index 000000000..72edec7cc --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-closerex.md @@ -0,0 +1,28 @@ +--- +title: "system rex closerex" +excerpt: "Удалить неиспользуемые записи пользовательских таблиц, связанных с REX" +--- +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца REX-фонда (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex closerex accountname1 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-consolidate.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-consolidate.md new file mode 100644 index 000000000..b202a6020 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-consolidate.md @@ -0,0 +1,28 @@ +--- +title: "system rex consolidate" +excerpt: "Объединить бакеты погашения REX в один со сроком погашения 4 дня" +--- +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца REX-фонда (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex consolidate accountname1 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundcpuloan.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundcpuloan.md new file mode 100644 index 000000000..8d45da5d1 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundcpuloan.md @@ -0,0 +1,29 @@ +--- +title: "system rex defundcpuloan" +excerpt: "Вывести из фонда CPU-кредита" +--- +## Позиционные аргументы + +- `from` _TEXT_ — владелец кредита (обязательно) +- `loan_num` _TEXT_ — идентификатор кредита (обязательно) +- `payment` _TEXT_ — сумма к выводу (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + +```sh +cleos system rex defundcpuloan accountname1 abc123 "1 EOS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundnetloan.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundnetloan.md new file mode 100644 index 000000000..e20022f95 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-defundnetloan.md @@ -0,0 +1,31 @@ +## Описание + +Вывести из фонда сетевого кредита. + +## Позиционные аргументы + +- `from` _TEXT_ — владелец кредита (обязательно) +- `loan_num` _TEXT_ — идентификатор кредита (обязательно) +- `payment` _TEXT_ — сумма к выводу (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-j,--json` — вывести результат в формате JSON +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с + +## Примеры + + + +```sh +cleos system rex defundnetloan accountname1 abc123 "1 EOS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-deposit.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-deposit.md new file mode 100644 index 000000000..74bf376cc --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-deposit.md @@ -0,0 +1,28 @@ +--- +title: "system rex deposit" +excerpt: "Внести в REX-фонд владельца переводом с ликвидного баланса токенов" +--- +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца REX-фонда (обязательно) +- `amount` _TEXT_ — сумма пополнения REX-фонда (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-j,--json` — вывести результат в формате JSON +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) + +## Примеры + + +```sh +cleos system rex deposit accountname1 "1 SYS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundcpuloan.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundcpuloan.md new file mode 100644 index 000000000..e202a58e8 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundcpuloan.md @@ -0,0 +1,29 @@ +--- +title: "system rex fundcpuloan" +excerpt: "Пополнить фонд CPU-кредита" +--- +## Позиционные аргументы + +- `from` _TEXT_ — владелец кредита (обязательно) +- `loan_num` _TEXT_ — идентификатор кредита (обязательно) +- `payment` _TEXT_ — сумма пополнения (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-j,--json` — вывести результат в формате JSON +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с + +## Примеры + +```sh +cleos system rex fundcpuloan accountname1 abc123 "1 EOS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundnetloan.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundnetloan.md new file mode 100644 index 000000000..6f401017c --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-fundnetloan.md @@ -0,0 +1,30 @@ +--- +title: "system rex fundnetloan" +excerpt: "Пополнить фонд сетевого кредита" +--- +## Позиционные аргументы + +- `from` _TEXT_ — владелец кредита (обязательно) +- `loan_num` _TEXT_ — идентификатор кредита (обязательно) +- `payment` _TEXT_ — сумма пополнения (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-j,--json` — вывести результат в формате JSON +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с + +## Примеры + + +```sh +cleos system rex fundnetloan accountname1 abc123 "1 EOS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-lendrex.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-lendrex.md new file mode 100644 index 000000000..4d066e14f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-lendrex.md @@ -0,0 +1,29 @@ +--- +title: "system rex lendrex" +excerpt: "Внести токены в REX-фонд и купить на них REX" +--- +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, покупающая REX (обязательно) +- `amount` _TEXT_ — сумма токенов для внесения в REX-фонд и покупки REX (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex lendrex accountname1 "1 REX" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvfromsavings.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvfromsavings.md new file mode 100644 index 000000000..47da69e70 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvfromsavings.md @@ -0,0 +1,29 @@ +--- +title: "system rex mvfromsavings" +excerpt: "Переместить токены REX из сберегательного бакета" +--- +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца REX-фонда (обязательно) +- `rex` _TEXT_ — объём REX для вывода из сберегательного бакета (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex mvfromsavings accountname1 "1 REX" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvtosavings.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvtosavings.md new file mode 100644 index 000000000..df9868080 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-mvtosavings.md @@ -0,0 +1,30 @@ +--- +title: "system rex mvtosavings" +excerpt: "Переместить токены REX в сберегательный бакет" +--- +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца REX-фонда (обязательно) +- `rex` _TEXT_ — объём REX для перемещения в сберегательный бакет (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + + +## Примеры + + +```sh +cleos system rex mvtosavings accountname1 "1 REX" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentcpu.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentcpu.md new file mode 100644 index 000000000..6f60e9a18 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentcpu.md @@ -0,0 +1,31 @@ +## Описание + +Арендовать CPU на 30 дней. + +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, оплачивающая аренду (обязательно) +- `receiver` _TEXT_ — учётная запись, на которую застейкована арендованная CPU (обязательно) +- `loan_payment` _TEXT_ — комиссия по кредиту; по ней рассчитывается объём арендованной пропускной способности (обязательно) +- `loan_fund` _TEXT_ — фонд кредита для автоматического продления; может быть 0 токенов (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex rentcpu accountname1 accountname2 "1 EOS" 0 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentnet.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentnet.md new file mode 100644 index 000000000..15aed05ee --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rentnet.md @@ -0,0 +1,31 @@ +## Описание + +Арендовать сетевую пропускную способность на 30 дней. + +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, оплачивающая аренду (обязательно) +- `receiver` _TEXT_ — учётная запись, на которую застейкована арендованная NET (обязательно) +- `loan_payment` _TEXT_ — комиссия по кредиту; по ней рассчитывается объём арендованной пропускной способности (обязательно) +- `loan_fund` _TEXT_ — фонд кредита для автоматического продления; может быть 0 токенов (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex rentnet accountname1 accountname2 "1 EOS" 0 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rexexec.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rexexec.md new file mode 100644 index 000000000..58ea55f59 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-rexexec.md @@ -0,0 +1,29 @@ +## Описание + +Выполнить обслуживание REX: обработать истёкшие кредиты и неисполненные ордера на продажу. + +## Позиционные аргументы + +- `user` _TEXT_ — учётная запись, выполняющая действие (обязательно) +- `max` _TEXT_ — максимальное число обрабатываемых CPU-кредитов, сетевых кредитов и ордеров на продажу (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex rexexec accountname1 10 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-sellrex.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-sellrex.md new file mode 100644 index 000000000..59b3ea7f9 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-sellrex.md @@ -0,0 +1,27 @@ +## Описание + +Продать токены REX. + +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, продающая REX (обязательно) +- `rex` _TEXT_ — объём продаваемых REX (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) + +## Примеры + + +```sh +cleos system rex sellrex accountname1 "1 REX" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-unstaketorex.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-unstaketorex.md new file mode 100644 index 000000000..33ead39d6 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-unstaketorex.md @@ -0,0 +1,31 @@ +## Описание + +Купить REX, сняв стейк с CPU и NET. + +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, покупающая REX (обязательно) +- `receiver` _TEXT_ — учётная запись, на которую застейканы токены (обязательно) +- `from_cpu` _TEXT_ — сумма для анстейка с CPU и направления на покупку REX (обязательно) +- `from_net` _TEXT_ — сумма для анстейка с NET и направления на покупку REX (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex unstaketorex accountname1 accountname2 "1 EOS" 0 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-updaterex.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-updaterex.md new file mode 100644 index 000000000..2f7ddd6e6 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-updaterex.md @@ -0,0 +1,28 @@ +## Описание + +Обновить стейк голоса владельца REX и вес голоса. + +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца REX-фонда (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex updaterex accountname1 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-withdraw.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-withdraw.md new file mode 100644 index 000000000..273973150 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex-withdraw.md @@ -0,0 +1,29 @@ +## Описание + +Вывести из REX-фонда на ликвидный баланс токенов. + +## Позиционные аргументы + +- `owner` _TEXT_ — учётная запись владельца REX-фонда (обязательно) +- `amount` _TEXT_ — сумма вывода из REX-фонда (обязательно) + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры + + +```sh +cleos system rex withdraw accountname1 "1 SYS" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex.md new file mode 100644 index 000000000..05f13a0f3 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-rex.md @@ -0,0 +1,25 @@ +## Описание + +Действия, связанные с REX (биржа ресурсов). + +## Подкоманды + +- [deposit](system-rex-deposit.md) — внести в REX-фонд владельца, переводом с ликвидного баланса токенов +- [withdraw](system-rex-withdraw.md) — вывести из REX-фонда владельца на ликвидный баланс токенов +- [buyrex](system-rex-buyrex.md) — купить REX за токены из REX-фонда владельца +- [lendrex](system-rex-lendrex.md) — внести токены в REX-фонд и купить на них REX +- [unstaketorex](system-rex-unstaketorex.md) — купить REX за застейканные токены +- [sellrex](system-rex-sellrex.md) — продать токены REX +- [cancelrexorder](system-rex-cancelrexorder.md) — отменить отложенный ордер на продажу REX, если он есть +- [mvtosavings](system-rex-mvtosavings.md) — переместить токены REX в сберегательный бакет +- [mvfromsavings](system-rex-mvfromsavings.md) — переместить токены REX из сберегательного бакета +- [rentcpu](system-rex-rentcpu.md) — арендовать CPU на 30 дней +- [rentnet](system-rex-rentnet.md) — арендовать сетевую пропускную способность на 30 дней +- [fundcpuloan](system-rex-fundcpuloan.md) — пополнить фонд CPU-кредита +- [fundnetloan](system-rex-fundnetloan.md) — пополнить фонд сетевого кредита +- [defundcpuloan](system-rex-defundcpuloan.md) — вывести из фонда CPU-кредита +- [defundnetloan](system-rex-defundnetloan.md) — вывести из фонда сетевого кредита +- [consolidate](system-rex-consolidate.md) — объединить бакеты погашения REX в один со сроком погашения 4 дня +- [updaterex](system-rex-updaterex.md) — обновить стейк голоса владельца REX и вес голоса +- [rexexec](system-rex-rexexec.md) — выполнить обслуживание REX: обработать истёкшие кредиты и неисполненные ордера на продажу +- [closerex](system-rex-closerex.md) — удалить неиспользуемые записи пользовательских таблиц, связанных с REX diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-sellram.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-sellram.md new file mode 100644 index 000000000..23c4c8c1b --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-sellram.md @@ -0,0 +1,24 @@ +## Описание + +Продать RAM. + +## Позиционные аргументы + +- `account` _TEXT_ — учётная запись, получающая EOS за проданную RAM +- `bytes` _UINT_ — число байт RAM для продажи + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-undelegatebw.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-undelegatebw.md new file mode 100644 index 000000000..3070d0194 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-undelegatebw.md @@ -0,0 +1,22 @@ +## Позиционные аргументы + +- `from` _TEXT_ — учётная запись, отменяющая делегирование пропускной способности +- `receiver` _TEXT_ — учётная запись, у которой отменяется делегирование +- `unstake_net_quantity` _TEXT_ — сумма EOS для снятия делегирования с сетевой пропускной способности +- `unstake_cpu_quantity` _TEXT_ — сумма EOS для снятия делегирования с CPU + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregprod.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregprod.md new file mode 100644 index 000000000..333aa7e01 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregprod.md @@ -0,0 +1,19 @@ +## Позиционные аргументы + +`account` _TEXT_ — учётная запись для снятия регистрации продюсера + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregproxy.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregproxy.md new file mode 100644 index 000000000..3b457683a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-unregproxy.md @@ -0,0 +1,19 @@ +## Позиционные аргументы + +- `proxy` _TEXT_ — учётная запись прокси для снятия регистрации + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-approve.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-approve.md new file mode 100644 index 000000000..c52668867 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-approve.md @@ -0,0 +1,20 @@ +## Позиционные аргументы + + - `voter` _TEXT_ — учётная запись голосующего + - `producer` _TEXT_ — учётная запись продюсера, за которого голосуют + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-prods.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-prods.md new file mode 100644 index 000000000..ad0e80409 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-prods.md @@ -0,0 +1,20 @@ +## Позиционные аргументы + +- `voter` _TEXT_ — учётная запись голосующего +- `producers` _TEXT ..._ — учётные записи продюсеров, за которых голосуют. Все аргументы с этой позиции и далее считаются списком продюсеров. + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-proxy.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-proxy.md new file mode 100644 index 000000000..d3de5b925 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-proxy.md @@ -0,0 +1,20 @@ +## Позиционные аргументы + +- `voter` _TEXT_ — учётная запись голосующего +- `proxy` _TEXT_ — учётная запись прокси + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-unapprove.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-unapprove.md new file mode 100644 index 000000000..236ec2a3d --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer-unapprove.md @@ -0,0 +1,20 @@ +## Позиционные аргументы + +- `voter` _TEXT_ — учётная запись голосующего +- `producer` _TEXT_ — учётная запись продюсера, удаляемого из списка голосования + +## Опции + +- `-h,--help` — показать справку и выйти +- `-x,--expiration` _TEXT_ — время в секундах до истечения транзакции; по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной; увеличивает расход пропускной способности и снимает защиту от случайной повторной отправки той же транзакции +- `-s,--skip-sign` — указывает, использовать ли ключи из разблокированного кошелька для подписи транзакции +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `-r,--ref-block` _TEXT_ — номер или идентификатор опорного блока для TAPOS (Transaction as Proof-of-Stake) +- `-p,--permission` _TEXT_ — учётная запись и уровень разрешения для авторизации, в формате «account@permission» (по умолчанию «account@active») +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU при выполнении транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета сети в байтах для транзакции (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка delay_sec в секундах; по умолчанию 0 с +- `-j,--json` — вывести результат в формате JSON + +## Примеры diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer.md new file mode 100644 index 000000000..dae1c3b14 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/system/system-voteproducer.md @@ -0,0 +1,6 @@ +## Подкоманды + +- [voteproducer proxy](system-voteproducer-proxy.md) — голосовать стейком через прокси +- [voteproducer prods](system-voteproducer-prods.md) — голосовать за одного или нескольких продюсеров +- [voteproducer approve](system-voteproducer-approve.md) — добавить одного продюсера в список голосования +- [voteproducer unapprove](system-voteproducer-unapprove.md) — убрать одного продюсера из списка голосования diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/transfer.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/transfer.md new file mode 100644 index 000000000..1049c5ddb --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/transfer.md @@ -0,0 +1,81 @@ +## Описание +Перевести токены с одного аккаунта на другой + +## Позиционные параметры +- `sender` _TEXT_ — аккаунт-отправитель +- `recipient` _TEXT_ — аккаунт-получатель +- `amount` _UINT_ — сумма EOS для перевода +- `memo` _TEXT_ — memo для перевода + +## Опции +- `-c,--contract` _TEXT_ — контракт, управляющий токеном +- `--pay-ram-to-open` — оплатить RAM за открытие строки баланса получателя +- `-x,--expiration` — время в секундах до истечения транзакции, по умолчанию 30 с +- `-f,--force-unique` — принудительно сделать транзакцию уникальной (дополнительный расход bandwidth, снимается защита от случайной повторной отправки той же транзакции) +- `-s,--skip-sign` — не использовать ключи разблокированного кошелька для подписи +- `-j,--json` — вывести результат в JSON +- `--json-file` _TEXT_ — сохранить результат в JSON в файл +- `-d,--dont-broadcast` — не транслировать транзакцию в сеть (только вывести в stdout) +- `--return-packed` — вместе с `--dont-broadcast` вернуть упакованную транзакцию +- `-r,--ref-block` _TEXT_ — номер блока или id блока для TAPOS (Transaction as Proof-of-Stake) +- `--use-old-rpc` — использовать старый RPC `push_transaction` вместо нового `send_transaction` +- `-p,--permission` _TEXT_ ... — аккаунт и уровень разрешения для авторизации в виде `account@permission` (по умолчанию `sender@active`) +- `--max-cpu-usage-ms` _UINT_ — верхний предел миллисекунд бюджета CPU на выполнение транзакции (0 — без ограничения) +- `--max-net-usage` _UINT_ — верхний предел бюджета net в байтах (0 — без ограничения) +- `--delay-sec` _UINT_ — задержка `delay_sec` в секундах, по умолчанию 0 + +## Пример +Перевести 1000 SYS с **inita** на **tester** + +```sh +cleos transfer inita tester 1000 +``` +Ответ может выглядеть примерно так: + +```json +{ + "transaction_id": "eb4b94b72718a369af09eb2e7885b3f494dd1d8a20278a6634611d5edd76b703", + "processed": { + "refBlockNum": 2206, + "refBlockPrefix": 221394282, + "expiration": "2017-09-05T08:03:58", + "scope": [ + "inita", + "tester" + ], + "signatures": [ + "1f22e64240e1e479eee6ccbbd79a29f1a6eb6020384b4cca1a958e7c708d3e562009ae6e60afac96f9a3b89d729a50cd5a7b5a7a647540ba1678831bf970e83312" + ], + "messages": [{ + "code": "eos", + "type": "transfer", + "authorization": [{ + "account": "inita", + "permission": "active" + } + ], + "data": { + "from": "inita", + "to": "tester", + "amount": 1000, + "memo": "" + }, + "hex_data": "000000008040934b00000000c84267a1e80300000000000000" + } + ], + "output": [{ + "notify": [{ + "name": "tester", + "output": { ... } + },{ + "name": "inita", + "output": { ... } + } + ], + "sync_transactions": [], + "async_transactions": [] + } + ] + } +} +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/client.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/client.md new file mode 100644 index 000000000..27f29f019 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/client.md @@ -0,0 +1,11 @@ +## Описание + +Получить сведения о версии клиента + +## Позиционные параметры +нет +## Использование + +```sh +cleos version client +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/index.md new file mode 100644 index 000000000..c0f6f9339 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/version/index.md @@ -0,0 +1,23 @@ +## Описание + +Получить сведения о версии + +## Команда + +```sh +cleos version +``` + +## Подкоманды +[client](client.md) — версия клиента + +```sh +cleos version client +``` + +## Вывод + + +```console +Build version: 7f854a61 +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create.md new file mode 100644 index 000000000..03989e5e9 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create.md @@ -0,0 +1,10 @@ +## Описание + +Создаёт кошелёк с указанным именем. Если имя не задано, используется `default` + +## Позиционные параметры +Нет +## Опции +- `-n, --name` _TEXT_ — имя нового кошелька +- `-f, --file` _TEXT_ — файл для записи пароля кошелька (обязателен, если не передан `--to-console`) +- `--to-console` — вывести пароль в консоль diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create_key.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create_key.md new file mode 100644 index 000000000..6f83c6edb --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/create_key.md @@ -0,0 +1,23 @@ +## Описание + +Создаёт пару ключей в кошельке, чтобы не импортировать её вручную, как после `cleos create key`. По умолчанию создаётся ключ типа, «предпочитаемый» кошельком (K1). Можно создать ключ в формате R1. + +## Позиционные параметры + +`key_type` _TEXT_ — тип ключа: `K1` или `R1` + +## Опции + +-n,--name TEXT=default Имя кошелька, в котором создаётся ключ + +## Использование + +```sh +cleos wallet create_key K1 +``` + +## Вывод + +```console +Created new private key with a public key of: "EOS67xHKzQArkWZN6rKLCq7NLvaj8kurwxzRxoTVz6cgDJkiWdGug" +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/import.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/import.md new file mode 100644 index 000000000..87cfb6c96 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/import.md @@ -0,0 +1,9 @@ +## Описание +Импортировать приватный ключ в кошелёк + +## Позиционные параметры +Нет + +## Опции +- `-n, --name` _TEXT_ — кошелёк, в который импортируется ключ +- `--private-key` _TEXT_ — приватный ключ в формате WIF diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/index.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/index.md new file mode 100644 index 000000000..fc3245c15 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/index.md @@ -0,0 +1,15 @@ +## Описание +Подкоманды для работы с локальным кошельком. + +## Подкоманды + +- [create](create.md) — создать новый локальный кошелёк +- [create_key](create_key.md) — создать пару ключей в кошельке +- [open](open.md) — открыть существующий кошелёк +- [lock](lock.md) — заблокировать кошелёк +- [lock_all](lock_all.md) — заблокировать все разблокированные кошельки +- [unlock](unlock.md) — разблокировать кошелёк +- [import](import.md) — импортировать приватный ключ в кошелёк +- [list](list.md) — список открытых кошельков, * = разблокирован +- [keys](keys.md) — список приватных ключей из всех разблокированных кошельков в формате WIF +- [private_keys](private_keys.md) — список публичных ключей из всех разблокированных кошельков diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/keys.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/keys.md new file mode 100644 index 000000000..82f5e8fe1 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/keys.md @@ -0,0 +1,25 @@ +## Описание + +Список публичных ключей из всех разблокированных кошельков; эти ключи могут использоваться для подписи транзакций. + +## Позиционные параметры +Нет. +## Опции +Нет. +## Использование + + +```sh +cleos wallet keys +``` + +## Вывод + + +```console +[[ + "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", + "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3" + ] +] +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/list.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/list.md new file mode 100644 index 000000000..1f0c2ab55 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/list.md @@ -0,0 +1,35 @@ +## Описание + +Список открытых кошельков; * означает разблокирован + +## Позиционные параметры +Нет + +## Опции +Нет + +## Использование + + +```sh +cleos wallet list +``` + +## Вывод + + +```console +Wallets: +[ + "default *", + "second-wallet *" +] +``` + +или если кошельков нет: + +```console +Wallets: +[ +] +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock.md new file mode 100644 index 000000000..3b5665efb --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock.md @@ -0,0 +1,25 @@ +## Описание + +Блокирует кошелёк + +## Позиционные параметры +Нет + +## Опции +- `-n, --name` _TEXT_ — имя кошелька для блокировки +## Использование + + +```sh +cleos wallet lock +``` +или +```sh +cleos wallet lock -n second-wallet +``` + +## Вывод + +```console +Locked: 'default' +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock_all.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock_all.md new file mode 100644 index 000000000..c02f0725d --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/lock_all.md @@ -0,0 +1,21 @@ +## Описание +Блокирует все разблокированные кошельки + + +## Позиционные параметры +Нет +## Опции +Нет +## Использование + + +```sh +cleos wallet lock_all +``` + +## Вывод + + +```console +Locked All Wallets +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/open.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/open.md new file mode 100644 index 000000000..7c2f69e3a --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/open.md @@ -0,0 +1,25 @@ +## Описание + +Открывает существующий кошелёк + +## Позиционные параметры +Нет +## Опции +- `-n, --name` _TEXT_ — имя кошелька для открытия +## Использование + + +```sh +cleos wallet open +``` +или +```sh +cleos wallet open -n second-wallet +``` + +## Вывод + + +```console +Opened: default +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/private_keys.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/private_keys.md new file mode 100644 index 000000000..adaac80dd --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/private_keys.md @@ -0,0 +1,18 @@ +## Описание + +Можно запросить пары публичный/приватный ключ кошелька. Кошелёк должен быть разблокирован; пароль нужно ввести снова. + +## Позиционные параметры +Нет + +## Опции +`-n,--name` _TEXT_ — имя кошелька для списка ключей, иначе используется default + +`--password` _TEXT_ — пароль, выданный при `wallet create` + +## Использование + + +```javascript +cleos wallet private_keys +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/unlock.md b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/unlock.md new file mode 100644 index 000000000..f3e75660f --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/03_command-reference/wallet/unlock.md @@ -0,0 +1,21 @@ +## Описание +Разблокирует кошелёк + +## Позиционные параметры +Нет +## Опции +- `-n, --name` _TEXT_ — имя кошелька +- `--password` _TEXT_ — пароль, выданный при создании кошелька +## Использование +Укажите пароль, полученный при создании кошелька. + +```sh +cleos wallet unlock -n second-wallet --password PW5Ji6JUrLjhKAVn68nmacLxwhvtqUAV18J7iycZppsPKeoGGgBEw +``` + +## Вывод + + +```console +Unlocked: 'second-wallet' +``` diff --git a/docs/documentation/blockchain/coopos/02_cleos/04_troubleshooting.md b/docs/documentation/blockchain/coopos/02_cleos/04_troubleshooting.md new file mode 100644 index 000000000..879f8d5f2 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/04_troubleshooting.md @@ -0,0 +1,23 @@ +--- +content_title: Cleos Troubleshooting +--- + +## Cannot connect to RPC endpoint + +Check if your local `nodeos` is running by visiting the following URL in your browser: + +```sh +curl http://localhost:8888/v1/chain/get_info +``` + +If you are trying to connect a remote `nodeos` API endpoint, try to visit the API endpoint with the following suffix: + +```sh +http://API_ENDPOINT:PORT/v1/chain/get_info +``` + +Replace API_ENDPOINT and PORT with your remote `nodeos` API endpoint detail + +## "Missing Authorizations" + +That means you are not using the required authorizations. Most likely you are not using correct COOPOS account or permission level to sign the transaction diff --git a/docs/documentation/blockchain/coopos/02_cleos/05_FAQ.md b/docs/documentation/blockchain/coopos/02_cleos/05_FAQ.md new file mode 100644 index 000000000..45369620c --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/05_FAQ.md @@ -0,0 +1,11 @@ +--- +content_title: Частые вопросы по Cleos +--- + +## Domain Socket (IPC) и HTTPS (RPC) + +Есть два способа подключить `cleos` к `keosd`: доменные сокеты или HTTPS. Доменный сокет даёт ряд преимуществ: снижается риск утечки доступа к `keosd` в LAN, WAN или Интернет. В отличие от HTTPS, где возможны многие векторы атак (в том числе CORS), доменный сокет доступен только для межпроцессного взаимодействия (IPC) в рамках задуманного сценария. + +## Что означает «transaction executed locally, but may not be confirmed by the network yet»? + +Это значит, что транзакция успешно принята и выполнена тем экземпляром `nodeos`, которому `cleos` отправил её напрямую. Этот экземпляр `nodeos` должен ретранслировать транзакцию другим узлам по peer-to-peer-протоколу, но нет гарантии, что остальные узлы примут или выполнят её. На этом этапе также нет гарантии, что транзакция принята и выполнена валидным блок-продюсером и включена в валидный блок цепочки. Если нужна более надёжная уверенность во включении транзакции в неизменяемый блокчейн, нужны дополнительные шаги: отслеживать появление транзакции в необратимом (irreversible) блоке. diff --git a/docs/documentation/blockchain/coopos/02_cleos/index.md b/docs/documentation/blockchain/coopos/02_cleos/index.md new file mode 100644 index 000000000..305acd4f8 --- /dev/null +++ b/docs/documentation/blockchain/coopos/02_cleos/index.md @@ -0,0 +1,125 @@ +--- +content_title: Cleos +--- + +!!! note "Сеть COOPOS" + **cleos** — интерфейс командной строки к **nodeos** и **keosd**. Поведение ресурсов и **powerup**: [концепция](../system-resources.md), [примеры cleos](../resources-powerup-ru.md). + +## Введение + +`cleos` — утилита командной строки для работы с REST API, который предоставляет `nodeos`. Через `cleos` можно разворачивать и проверять смарт-контракты COOPOS. + +## Установка + +`cleos` входит в [репозиторий COOPOS](https://github.com/coopenomics/coopos). Порядок установки — в разделе [Установка ПО COOPOS](../00_install/index.md). + +## Использование cleos + +Нужен адрес работающего экземпляра `nodeos` (IP и порт). При запуске `nodeos` должен быть подключён плагин `eosio::chain_api_plugin`, иначе узел не ответит на RPC-запросы `cleos`. + +### Команды cleos + +Полный список команд: + +```sh +cleos --help +``` + +```console +Command Line Interface to COOPOS Client +Usage: cleos [OPTIONS] SUBCOMMAND + +Options: + -h,--help Print this help message and exit + -u,--url TEXT=http://127.0.0.1:8888/ + the http/https URL where nodeos is running + --wallet-url TEXT=unix:///Users/username/eosio-wallet/keosd.sock + the http/https URL where keosd is running + -r,--header pass specific HTTP header; repeat this option to pass multiple headers + -n,--no-verify don't verify peer certificate when using HTTPS + --no-auto-keosd don't automatically launch a keosd if one is not currently running + -v,--verbose output verbose errors and action console output + --print-request print HTTP request to STDERR + --print-response print HTTP response to STDERR + +Subcommands: + version Retrieve version information + create Create various items, on and off the blockchain + convert Pack and unpack transactions + get Retrieve various items and information from the blockchain + set Set or update blockchain state + transfer Transfer tokens from account to account + net Interact with local p2p network connections + wallet Interact with local wallet + sign Sign a transaction + push Push arbitrary transactions to the blockchain + multisig Multisig contract commands + wrap Wrap contract commands + system Send eosio.system contract action to the blockchain. +``` + +### Подкоманды cleos + +Справка по конкретной подкоманде: `cleos SUBCOMMAND --help`. Например: + +```sh +cleos create --help +``` + +```console +Create various items, on and off the blockchain +Usage: cleos create SUBCOMMAND + +Subcommands: + key Create a new keypair and print the public and private keys + account Create a new account on the blockchain + (assumes system contract does not restrict RAM usage) +``` + +Для вложенных подкоманд справка тоже доступна. Например: + +```sh +cleos create account --help +``` + +```console +Create a new account on the blockchain (assumes system contract does not restrict RAM usage) +Usage: cleos create account [OPTIONS] creator name OwnerKey [ActiveKey] + +Positionals: + creator TEXT The name of the account creating the new account (required) + name TEXT The name of the new account (required) + OwnerKey TEXT The owner public key or permission level for the new account (required) + ActiveKey TEXT The active public key or permission level for the new account + +Options: + -h,--help Print this help message and exit + -x,--expiration set the time in seconds before a transaction expires, defaults to 30s + -f,--force-unique force the transaction to be unique. this will consume extra bandwidth and remove any protections against accidently issuing the same transaction multiple times + -s,--skip-sign Specify if unlocked wallet keys should be used to sign transaction + -j,--json print result as json + --json-file TEXT save result in json format into a file + -d,--dont-broadcast don't broadcast transaction to the network (just print to stdout) + --return-packed used in conjunction with --dont-broadcast to get the packed transaction + -r,--ref-block TEXT set the reference block num or block id used for TAPOS (Transaction as Proof-of-Stake) + --use-old-rpc use old RPC push_transaction, rather than new RPC send_transaction + -p,--permission TEXT ... An account and permission level to authorize, as in 'account@permission' (defaults to 'creator@active') + --max-cpu-usage-ms UINT set an upper limit on the milliseconds of cpu usage budget, for the execution of the transaction (defaults to 0 which means no limit) + --max-net-usage UINT set an upper limit on the net usage budget, in bytes, for the transaction (defaults to 0 which means no limit) + --delay-sec UINT set the delay_sec seconds, defaults to 0s +``` + +## Пример + +Команда ниже создаёт локальный кошелёк `mywallet` и выводит пароль: + +```sh +cleos wallet create -n mywallet --to-console +``` + +```console +Creating wallet: mywallet +Save password to use in the future to unlock this wallet. +Without password imported keys will not be retrievable. +"PW5JbF34UdA193Eps1bjrWVJRaNMt1VKddLn4Dx6SPVTfMDRnMBWN" +``` diff --git a/docs/documentation/blockchain/coopos/03_keosd/10_usage.md b/docs/documentation/blockchain/coopos/03_keosd/10_usage.md new file mode 100644 index 000000000..39f1d87c3 --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/10_usage.md @@ -0,0 +1,107 @@ +--- +content_title: Использование keosd +--- + +!!! note "Рекомендуемый способ" + Чаще всего удобнее, чтобы `keosd` запускал автоматически `cleos`. Файлы кошельков создаются в каталоге по умолчанию (`~/eosio-wallet`). + +## Ручной запуск keosd + +`keosd` можно запустить вручную в терминале: + +```sh +keosd +``` + +По умолчанию `keosd` создаёт папку `~/eosio-wallet` и базовый файл `config.ini`. Расположение конфигурации задаётся аргументом `--config-dir`. В конфигурации задаётся HTTP-endpoint для входящих соединений и прочие параметры CORS. + +!!! note "Расположение кошелька" + Каталог данных кошелька задаётся опцией `--data-dir`. + +## Автоблокировка + +По умолчанию `keosd` блокирует кошелёк после 15 минут неактивности. В `config.ini` это настраивается секундами в `unlock-timeout`. В исходной документации указано, что значение `0` приводит к тому, что кошелёк всегда остаётся заблокированным; уточните поведение для вашей версии по выводу `keosd --help`. + +## Остановка keosd + +Надёжный способ — найти процесс `keosd` и отправить ему сигнал SIGTERM. + +## Прочие опции + +Список опций `keosd` — запуск без аргументов: + +```sh +keosd --help +``` + +```console +Application Options: + +Config Options for eosio::http_plugin: + --unix-socket-path arg (=keosd.sock) The filename (relative to data-dir) to + create a unix socket for HTTP RPC; set + blank to disable. + --http-server-address arg The local IP and port to listen for + incoming http connections; leave blank + to disable. + --access-control-allow-origin arg Specify the Access-Control-Allow-Origin + to be returned on each request. + --access-control-allow-headers arg Specify the Access-Control-Allow-Header + s to be returned on each request. + --access-control-max-age arg Specify the Access-Control-Max-Age to + be returned on each request. + --access-control-allow-credentials Specify if Access-Control-Allow-Credent + ials: true should be returned on each + request. + --max-body-size arg (=1048576) The maximum body size in bytes allowed + for incoming RPC requests + --http-max-bytes-in-flight-mb arg (=500) + Maximum size in megabytes http_plugin + should use for processing http + requests. 503 error response when + exceeded. + --verbose-http-errors Append the error log to HTTP responses + --http-validate-host arg (=1) If set to false, then any incoming + "Host" header is considered valid + --http-alias arg Additionaly acceptable values for the + "Host" header of incoming HTTP + requests, can be specified multiple + times. Includes http/s_server_address + by default. + --http-threads arg (=2) Number of worker threads in http thread + pool + +Config Options for eosio::wallet_plugin: + --wallet-dir arg (=".") The path of the wallet files (absolute + path or relative to application data + dir) + --unlock-timeout arg (=900) Timeout for unlocked wallet in seconds + (default 900 (15 minutes)). Wallets + will automatically lock after specified + number of seconds of inactivity. + Activity is defined as any wallet + command e.g. list-wallets. + +Application Config Options: + --plugin arg Plugin(s) to enable, may be specified + multiple times + +Application Command Line Options: + -h [ --help ] Print this help message and exit. + -v [ --version ] Print version information. + --print-default-config Print default configuration template + -d [ --data-dir ] arg Directory containing program runtime + data + --config-dir arg Directory containing configuration + files such as config.ini + -c [ --config ] arg (=config.ini) Configuration file name relative to + config-dir + -l [ --logconf ] arg (=logging.json) Logging configuration file name/path + for library users +``` + + +Исправляю раздел про `unlock-timeout` в `10_usage.md`: в оригинале указано «always lock» — перевожу буквально. + +<|tool▁calls▁begin|><|tool▁call▁begin|> +StrReplace \ No newline at end of file diff --git a/docs/documentation/blockchain/coopos/03_keosd/15_plugins/http_plugin.md b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/http_plugin.md new file mode 100644 index 000000000..fe2f3cc9d --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/http_plugin.md @@ -0,0 +1,3 @@ +--- +link: /01_nodeos/03_plugins/http_plugin/index.md +--- diff --git a/docs/documentation/blockchain/coopos/03_keosd/15_plugins/index.md b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/index.md new file mode 100644 index 000000000..b6444787c --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/index.md @@ -0,0 +1,14 @@ +--- +content_title: Плагины keosd +--- + +## Обзор + +Плагины расширяют базовую функциональность `keosd`. Описание конкретных плагинов — в списке ниже: + +* [`http_plugin`](../../01_nodeos/03_plugins/http_plugin/index.md) +* [`wallet_api_plugin`](wallet_api_plugin/index.md) +* [`wallet_plugin`](wallet_plugin/index.md) + +!!! note "Модульность keosd" + Плагины добавляют возможности по шагам. В отличие от подключаемых на лету модулей, плагины `keosd` собираются на этапе компиляции. diff --git a/docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_api_plugin/index.md b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_api_plugin/index.md new file mode 100644 index 000000000..2304bed75 --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_api_plugin/index.md @@ -0,0 +1,45 @@ +--- +content_title: Плагин wallet_api_plugin +--- + +## Описание + +Плагин `wallet_api_plugin` выставляет возможности [`wallet_plugin`](../wallet_plugin/index.md) через RPC API, управляемое [`http_plugin`](../../../01_nodeos/03_plugins/http_plugin/index.md). + +!!! warning "Осторожно" + Плагин открывает доступ к кошелькам. Не рекомендуется запускать его на публично доступном узле. Начиная с 1.2.0, `wallet_api_plugin` доступен только через `keosd`; в `nodeos` больше не поддерживается. + +## Использование + +```sh +# config.ini +plugin = eosio::wallet_api_plugin + +# command-line +keosd ... --plugin eosio::wallet_api_plugin +``` + +## Опции + +Нет + +## Зависимости + +* [`wallet_plugin`](../wallet_plugin/index.md) +* [`http_plugin`](../../../01_nodeos/03_plugins/http_plugin/index.md) + +### Примеры загрузки зависимостей + +Следующие плагины подключаются с настройками по умолчанию, если не указаны в командной строке или `config.ini`: + +```sh +# config.ini +plugin = eosio::wallet_plugin +[options] +plugin = eosio::http_plugin +[options] + +# command-line +keosd ... --plugin eosio::wallet_plugin [options] \ + --plugin eosio::http_plugin [options] +``` diff --git a/docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_plugin/index.md b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_plugin/index.md new file mode 100644 index 000000000..1b838ffdf --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/15_plugins/wallet_plugin/index.md @@ -0,0 +1,45 @@ +--- +content_title: Плагин wallet_plugin (keosd / nodeos) +--- + +## Описание + +Плагин `wallet_plugin` добавляет доступ к функциям кошелька на узле. + +!!! warning "Осторожно" + Плагин не рассчитан на загрузку на публично доступном узле без дополнительных мер безопасности. Особенно это касается `wallet_api_plugin`, который ни при каких обстоятельствах не следует включать на публично доступном узле. + +## Использование + +```sh +# config.ini +plugin = eosio::wallet_plugin + +# command-line +nodeos ... --plugin eosio::wallet_plugin +``` + +## Опции + +Нет + +## Зависимости + +* `http_plugin` + +[//]: # ( THIS IS A COMMENT LINK BELOW IS BROKEN ) +[//]: # ( `http_plugin` ../http_plugin.md ) + +### Примеры загрузки зависимостей + +```sh +# config.ini +plugin = eosio::wallet_plugin +[options] +plugin = eosio::http_plugin +[options] + +# command-line +nodeos ... --plugin eosio::wallet_plugin [options] \ + --plugin eosio::http_plugin [options] +``` diff --git a/docs/documentation/blockchain/coopos/03_keosd/20_security.md b/docs/documentation/blockchain/coopos/03_keosd/20_security.md new file mode 100644 index 000000000..64fe0962d --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/20_security.md @@ -0,0 +1,17 @@ +--- +content_title: Безопасность keosd +--- + +### Как работает блокировка/разблокировка `keosd` и какие есть последствия для безопасности? + +С точки зрения пользователя после создания кошелёк остаётся в состоянии `unlocked`. В зависимости от способа запуска `keosd` он может оставаться `unlocked` до перезапуска процесса. При блокировке (по таймауту или после перезапуска) для разблокировки нужен пароль. + +Важно: у `keosd` нет механизма аутентификации/авторизации кроме блокировки/разблокировки кошелька для хранения/извлечения закрытых ключей и подписи сообщений. + +### Как обращаются к сервису `keosd` и какие риски? + +При доступе через доменный сокет любой пользователь/группа UNIX с правом записи в файл сокета может отправлять транзакции и получать подписанные транзакции от `keosd`, используя любой ключ из любого разблокированного кошелька. + +При TCP-сокете, привязанном к localhost, то же может делать любой локальный процесс (независимо от владельца и прав). В том числе фрагмент JavaScript на веб-странице в локальном браузере (у некоторых браузеров есть частичная защита). + +При TCP-сокете на адресе LAN/WAN любой удалённый участник, способный доставлять пакеты до машины с `keosd`, может делать то же самое. Это серьёзный риск, даже если трафик шифруется или идёт по HTTPS. diff --git a/docs/documentation/blockchain/coopos/03_keosd/35_wallet-specification.md b/docs/documentation/blockchain/coopos/03_keosd/35_wallet-specification.md new file mode 100644 index 000000000..ebd1f1adc --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/35_wallet-specification.md @@ -0,0 +1,144 @@ +--- +content_title: Спецификация кошелька EOS +--- + +## Формат импорта кошелька EOS (WIF) + +Wallet Import Format — кодирование закрытого ключа ECDSA. В EOS используются те же версия, контрольная сумма и схема кодирования, что и у Bitcoin WIF; совместимость с существующими библиотеками [1]. + +Пример закрытого ключа в WIF: + +``` +5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAbuatmU +``` + +Это кодирование удобно для: + +* копирования и вставки закрытых ключей (снижает риск обрезки) +* включения ключей в текстовые или редактируемые пользователем форматы +* сокращения длины записи ключа + +Менее удобно для: + +* ручной переписи ключа (ошибка в регистре буквы уже критична) +* бинарного хранилища, где ключ уже обрабатывается кодом и проверен + +Замечания: + +* Если ключ может быть записан от руки или набран заново, лучше подойдёт стандарт мнемоник BIP39. +* Имеет смысл помечать WIF-ключ словами «Private» или «Private Key». + +## Закрытый ключ → WIF + +1. Используется «фиктивный» закрытый ключ из нулей. Длина 32 байта (ниже в hex). + +``` +0000000000000000000000000000000000000000000000000000000000000000 +``` + +2. В начало добавляется байт 0x80. Он соответствует mainnet Bitcoin; в EOS используется тот же байт версии. При кодировании байт версии помогает отличить запись как закрытый ключ. В отличие от Bitcoin, в EOS всегда используются сжатые открытые ключи (производные от закрытого), поэтому к закрытому ключу не добавляется суффикс 0x01. + +``` +800000000000000000000000000000000000000000000000000000000000000000 +``` + +3. Выполняется двоичный хеш SHA-256 от ключа с версией. + +``` +ce145d282834c009c24410812a60588c1085b63d65a7effc2e0a5e3a2e21b236 +``` + +4. Выполняется двоичный SHA-256 от результата предыдущего шага. + +``` +0565fba7ebf8143516e0222d7950c28589a34c3ee144c3876ceb01bfb0e9bb70 +``` + +5. Первые 4 байта второго SHA-256 — контрольная сумма. + +``` +0565fba7 +``` + +6. К ключу с версией из шага 2 добавляются 4 байта контрольной суммы. + +``` +8000000000000000000000000000000000000000000000000000000000000000000565fba7 +``` + +7. Двоичные данные из шага 6 кодируются [Base58](http://npmjs.com/package/bs58). + +``` +5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAbuatmU +``` + +--- + +## WIF → закрытый ключ (проверка контрольной суммы) + +1. Начинаем с закрытого ключа в формате WIF. + +``` +5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAbuatmU +``` + +2. [Base58](http://npmjs.com/package/bs58)-декодирование строки WIF (ниже показано в HEX). + +``` +8000000000000000000000000000000000000000000000000000000000000000000565fba7 +``` + +3. Декодированные данные делятся на ключ с версией и контрольную сумму (последние 4 байта). + +``` +800000000000000000000000000000000000000000000000000000000000000000 +0565fba7 +``` + +4. Двоичный SHA-256 от ключа с версией. + +``` +ce145d282834c009c24410812a60588c1085b63d65a7effc2e0a5e3a2e21b236 +``` + +5. Двоичный SHA-256 от результата предыдущего шага. + +``` +0565fba7ebf8143516e0222d7950c28589a34c3ee144c3876ceb01bfb0e9bb70 +``` + +6. Первые 4 байта второго SHA-256 — контрольная сумма. + +``` +0565fba7 +``` + +7. Сравните контрольные суммы из шагов 3 и 6. + +8. Ключ с версией из шага 3 делится на байт версии и закрытый ключ. + +``` +80 +0000000000000000000000000000000000000000000000000000000000000000 +``` + +9. Если версия 0x80, ошибки нет. + +--- + +## [Base58check](https://www.npmjs.com/package/base58check) + +Base58Check — JavaScript-реализация этого алгоритма; ею можно кодировать и декодировать закрытые ключи EOS в формате WIF. + +```sh +base58check = require('base58check') +wif = base58check.encode(privateKey = '00'.repeat(32), version = '80', encoding = 'hex') +assert.equal('5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAbuatmU', wif) +let {prefix, data} = base58check.decode(wif) +assert.equal(prefix.toString('hex'), '80') +assert.equal(data.toString('hex'), '00'.repeat(32)) +``` + +--- + +[1] Формат Bitcoin WIF — https://en.bitcoin.it/wiki/Wallet_import_format diff --git a/docs/documentation/blockchain/coopos/03_keosd/40_troubleshooting.md b/docs/documentation/blockchain/coopos/03_keosd/40_troubleshooting.md new file mode 100644 index 000000000..58168a5db --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/40_troubleshooting.md @@ -0,0 +1,13 @@ +--- +content_title: Устранение неполадок keosd +--- + +## Как устранить ошибку «Failed to lock access to wallet directory; is another `keosd` running»? + +Так как `cleos` может автоматически запускать экземпляр `keosd`, на системе иногда оказывается несколько процессов `keosd`. Это может давать сбои или указанное сообщение. + +Завершите все запущенные экземпляры `keosd` и запустите `keosd` снова. Пример команды для завершения всех процессов `keosd`: + +```sh +pkill keosd +``` diff --git a/docs/documentation/blockchain/coopos/03_keosd/50_FAQ.md b/docs/documentation/blockchain/coopos/03_keosd/50_FAQ.md new file mode 100644 index 000000000..5a5a0cf41 --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/50_FAQ.md @@ -0,0 +1,11 @@ +--- +content_title: Частые вопросы о keosd +--- + +### Как `keosd` хранит пары ключей + +`keosd` шифрует пары ключей перед записью в файл кошелька. В зависимости от реализации (Secure Enclave, YubiHSM и т.д.) используется свой криптоалгоритм. При стандартной файловой системе на UNIX `keosd` шифрует пары ключей AES-256 в режиме CBC. + +### Как включить Secure Enclave в `keosd` + +Нужно подписать бинарник `keosd` сертификатом из Apple Developer Account. У консольных приложений при подписи могут быть ограничения со стороны App Store; подписанные бинарники иногда приходится переподписывать каждые 7 дней. diff --git a/docs/documentation/blockchain/coopos/03_keosd/index.md b/docs/documentation/blockchain/coopos/03_keosd/index.md new file mode 100644 index 000000000..47b9c9cc1 --- /dev/null +++ b/docs/documentation/blockchain/coopos/03_keosd/index.md @@ -0,0 +1,21 @@ +--- +content_title: keosd +--- + +!!! note "На русском" + **keosd** — демон кошелька для **cleos**. Ниже — полный текст раздела. + +## Введение + +`keosd` — фоновый сервис управления ключами: хранение закрытых ключей и подпись сообщений. Обеспечивает защищённое хранилище ключей с шифрованием «на диске» в файле кошелька. `keosd` задаёт защищённую среду для подписи транзакций, созданных `cleos` или сторонней библиотекой. + +## Установка + +`keosd` входит в [репозиторий COOPOS](https://github.com/coopenomics/coopos). Установка — в разделе [Установка ПО COOPOS](../00_install/index.md). + +## Работа + +Когда кошелёк разблокирован паролем, `cleos` может запросить у `keosd` подпись транзакции соответствующими закрытыми ключами. `keosd` также поддерживает аппаратные кошельки (например, Secure Enclave и YubiHSM). + +!!! note "Аудитория" + `keosd` предназначен в основном для разработчиков COOPOS. diff --git a/docs/documentation/blockchain/coopos/10_utilities/index.md b/docs/documentation/blockchain/coopos/10_utilities/index.md new file mode 100644 index 000000000..228a84426 --- /dev/null +++ b/docs/documentation/blockchain/coopos/10_utilities/index.md @@ -0,0 +1,11 @@ +--- +content_title: Утилиты COOPOS +link_text: Утилиты COOPOS +--- + +!!! note "На русском" + Утилиты COOPOS для **nodeos**; ниже — полный текст раздела. + +В этом разделе — документация по дополнительным утилитам, которые дополняют или расширяют `nodeos` и при необходимости другое ПО COOPOS: + +* [trace_api_util](trace_api_util.md) — низкоуровневая утилита для задач, связанных с [Trace API](../01_nodeos/03_plugins/trace_api_plugin/index.md). diff --git a/docs/documentation/blockchain/coopos/10_utilities/trace_api_util.md b/docs/documentation/blockchain/coopos/10_utilities/trace_api_util.md new file mode 100644 index 000000000..7534726ec --- /dev/null +++ b/docs/documentation/blockchain/coopos/10_utilities/trace_api_util.md @@ -0,0 +1,48 @@ +--- +content_title: Утилита trace_api_util +link_text: trace_api_util +--- + +`trace_api_util` — утилита командной строки (CLI), с помощью которой операторы узла выполняют низкоуровневые операции, связанные с [плагином Trace API](../01_nodeos/03_plugins/trace_api_plugin/index.md). `trace_api_util` поддерживает одну из следующих операций: + +* Сжатие файла трассировки `log` в сжатый формат `clog`. + +## Использование +```sh +trace_api_util command ... +``` + +## Опции +Опция (=по умолчанию) | Описание +-|- +`-h [ --help` ] | показать справку + +## Команды +Команда | Описание +-|- +`compress` | сжать файл трассировки в формат `clog` + +### compress +Сжимает файл трассировки `log` в формат `clog`. По умолчанию имя сжатого файла совпадает с `input-path`, но расширение меняется на `clog`. + +#### Использование +```sh +trace_api_util compress input-path [output-path] +``` + +#### Позиционные аргументы +Опция (=по умолчанию) | Описание +-|- +`input-path` | путь к сжимаемому файлу +`output-path` | [Необязательно] путь к выходному файлу или каталогу + +#### Опции +Опция (=по умолчанию) | Описание +-|- +`-h [ --help ]` | показать справку +`-s [ --seek-point-stride ] arg (=512)` | число байт между точками поиска в сжатой трассировке; меньший шаг может ухудшить сжатие, но ускорить чтение + +## Замечания +При запуске `trace_api_util` утилита пытается выполнить указанную операцию, возможны исходы: +* при успехе операция выполняется и процесс завершается с кодом 0; +* при ошибке сообщение выводится в `stderr`, код завершения ненулевой. diff --git a/docs/documentation/blockchain/coopos/doxygen.css b/docs/documentation/blockchain/coopos/doxygen.css new file mode 100644 index 000000000..266c8b3a6 --- /dev/null +++ b/docs/documentation/blockchain/coopos/doxygen.css @@ -0,0 +1,1596 @@ +/* The standard CSS for doxygen 1.8.14 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + + +/* @end */ diff --git a/docs/documentation/blockchain/coopos/index.md b/docs/documentation/blockchain/coopos/index.md new file mode 100644 index 000000000..3bca7d642 --- /dev/null +++ b/docs/documentation/blockchain/coopos/index.md @@ -0,0 +1,19 @@ +--- +content_title: Программы узла и справка по командам +--- + +# Программы узла и справка по командам + +Здесь — справка по **COOPOS**: установка, **nodeos**, **cleos**, **keosd**, плагины, HTTP API и утилиты. Страницы переводятся на русский; фрагменты вывода консоли и имена подкоманд **cleos** сохраняются как в CLI. + +## Компоненты + +- **[Установка](00_install/index.md)** — сборка из исходников, поддерживаемые ОС, вспомогательные средства. +- **[nodeos](01_nodeos/index.md)** — узел сети: запуск, плагины, реплеи, RPC, логирование, концепции, устранение неполадок. +- **[cleos](02_cleos/index.md)** — работа с HTTP API узла и с **keosd**. +- **[keosd](03_keosd/index.md)** — хранение ключей и подпись транзакций. +- **[Утилиты](10_utilities/index.md)** — дополнительные инструменты. + +В оглавлении эти материалы собраны под **cleos**: [Ресурсы сети, регистрация и контракты](../system-resources.md), [Ресурсы и powerup — примеры cleos](resources-powerup-ru.md). + +Остальные страницы дерева доступны по внутренним ссылкам и собираются сайтом документации. diff --git a/docs/documentation/blockchain/coopos/leap_components.png b/docs/documentation/blockchain/coopos/leap_components.png new file mode 100644 index 0000000000000000000000000000000000000000..59660cb775824b3d4cdd9d9a4ededb90c13e4f7d GIT binary patch literal 49499 zcmeFZhgVeD)-Q_f>E?9XYSSi^)B*}f5)qJW0Ff-9g zgQ_=_beWi#)tH#}5B&QVcylY;mye0*FD6x`E4RE8=SMM#x7MnpzEe)dikuHR8k}ND zVXZr5#dhmr?ERkmN>6*0VC{R=c0yvc|BWcl4ox}A^y;8MY*P}qWo-r4D+K3MAT%tL z)`RiPeQq-tA{45Y9eY-}c8*2tGn351&4bRvI zq2_fp0Z-#CG*!J{tFufm-LSe+?6{~iPB}DA z=~_+x3+cH9Z-?d87Z*J5X(V6Zi4}ICQPb>MmQ0o8SXnldYIlI*lvw{!X)H`{floH0^TinVFhRf8kKSX={&bS<1hHjo`LW&eZtat!#Api=8& z6dNFu)>Ed}Q10>Nir+mI&SGu$4%zpea3k*)QKmURQ&&ya>Ehott2LD5mmKaryV*H^?WlCywmiYpmuELextvv- z+1Ltj-u&FvH?w;b<1mtF8z$hEU~E&v>Pa~_*SuR=&Pn+TN7 z%HOxP%Dc7usp3ff-YO;vs1HG3D5m>acKEwdFEWqMM$+8;r@Zm5@Ct1Cy7S#_YamRH z($2cK;J$K5+Hwi(HRQUX-H-TFDcg3o;C^T1>ZA+p;xYBf9^3C$)hUp`7c;M`4EJg%v17dgybbo^D6D>0me{u0qTEGUnI~nJ{IZbH@p0Xs;9?g8bMtBCt z06$Jl>{KAKgJMQ}PcXgu71*$I;L-e$vGAJw{Ija@^b=U=?Txu4OqOYDvbg9W>E-67 zp*cMs?&}7EYjNbHUl~U--RFk$-Vh&N7okY4J{zL%&h%9VOPj=~x@c%7IJ)1;-gx!= zV4bdy5|JRdx8l{WKxI1|chRvT)j?Zfr=-%aQGW)+u8aS~qX++y_+y)@mUoj7c^%cB zUu2n>E}MX^Xg|e~4zhPhIahp3A3QYd6pMMIZ#VvWf9kd1t8y2;{KdE*OA5X4xJG=5 zPP$J(7B~0G@Ej$^W>7Q0cSC5zcNBZi#984YWt-<;(8RTC(OcbPCa=MNu%BQ-MwFY+%D^y)kTD@<0 zerCN=oN>+F7yLgn86E&;uHs7PJ05O?2nNz0R*n}+3+nfbrSi0g$65Fk#Oe;cHO|1E zp=h9^3PsPV?PKag{_r-xb;;^{-j#l~U4PfUDwDWMo+9Z-SC3y~K8$m4sT2*xeF9Z6 zOZq`$+*Kl+I`oRtW1m4Osg{wME4eF15pwFg!o0}IHSFiDRLcjp#_2;w#Jvj80nN_( z$1iq1Q=?4>eR`h{=~1RFAzHWLVRHpJ$*St&D=hxf9Rdpr3l(+%#saEC$HseB>XR}TGccKs2KQJCm82Fs0Nm6h0IF~`w) zeb^9Prl8wk0~|b-)FjN%h0M&kjtNGvIbxACGSTnku)RKWtYW^>)7q#Q3(`-B;j4`->08e>UET)*D6z@^t$9c4Sr!D?V(z{SPkqc3;K%QPydJ9fT^8ZIcc z(I$?B$uy@35$WUmgQ2(qx0TnLUZ2>U1OEzFoUC}Re7v7F^V!>Xo@-o|MANwSwlzF8 zoPICSf9mj9Ysp)wL0_l3Hd&{W95P3_x!1qQ9zffHZaaV}bb%iu`aAgA|F)s<{njiv zn8H>Sg&6afn|)Mszg?Hyw1*Ki++h&U4|mKh_f zhyTOSBFsx2VmG-TK+)!-dvMn0XoG%ov;70de{-#)q-21A?Iu6Cx0lSUPr9n|T zZ}O>)E}6;u3&n%><1q;)KWu9)0cq^9e4)AFY?C<8>NahxtBr>DZtrFnIU-_bee27) z2ue?$h!)4rlJ``n*iwQ8&BU>2vZHjne4BM^NwnUaIr$`EYcx#E!OJtry-3o8Mz{Us zoL~zP4?Xw$w+~6*pH*qL&F*%W;;RyqI5=Q^>r`HQhTTm5q(eZG3K#xa+xD0;Vzw^C z`G8*{H1L}}C0#EBU9`n*tE#k4nuInL8f6%sOSjCBJ4+$SqkZRcJu9&6OqXTBD|BY) zHF%cSM~Lo{49gvTOlhg^eKW_a{T8dQ&6iOREk$t!oOZ6<`lodFEp_~#VEhv*m#<8| zP^j5smt(=~g|_S;C^>oK>j^5shny(CaI+m8IbZHE!+!9fx>WNIG2{wS;LvO{h$CbQ z>?!YDwW!!XOC!@I1=dgcc+FEglg332EV^oExZk$FI8rjAAi4M+E5{jV?T;kJ!XoeM z5h{-vKD|zKZy4|-J6Sd?NQEAhobH>LlM0TQ_f)G~>MQIgCi}Ke`Pd@=cxT5NrHn6k zXmJKAO0_-~ifKkUiho}wU0Uhk8E?^xc&Z#4Tl>(ep{^z(JR&bbfo)@CLun*{V!=oj z2mA-VvQ~G;=8Z}w)E`ec_(Zsb^;E*|qx`e8G8fg0i;BKIuJazxwo9vYNBsP-tIIIe ze4mx$IlWI%ddB7w_!q;;2Gn|Kvd`f?DMSgB23}hITE)#hwlMo(b1q7>R(#wd-1Uh0 z6Ib}ZgG;GY&Q66poKbuBnpDW?hs?Ft_fxOir3UJpb7FlcIeVhY*ZGe+b2g=1a|&&~ zE6u%t5RAk9vwvGjEyDqvj(&EJsPl7W#DMz-3>R5^DQ&t!l5cmW9a9@}tmx9(L`{NB zxBZOSJWKG?5uQUQ%NqQsZ}sohspnRn1Xsp>#3BLyOJdKhQjp;EwKmN%)S-6FdCnT1 z2-sc?`SfrbnarPl^Th$|7u?#X&E`8N%1FJU+(gH&P~>ti^F#d87f3Ud!G209x+Gc` z(?7ytR^b)Sb7<$jIIoH9L$w{tn;91DrKB9nFu_t;_+D$E?Au%Sl+!K<-fKx@TbUAl zYVY|?R*@`>19sL8_il+T^)@c`h>O<05TxMB%MXdozLFmw5l#F&$um#gc#XTKt!Qp1a$yw{a>b-4y8fPBJ zv%WLk)|p{N^&YwsYvbBxgnud)Xa0wJtWcPh_O=&PcvjgtMUFn>ehHe#|3EwKh9kGu z`&L=0<%JlgNV}B0%g4=~Qc1^6srH0$czq!*VMVreTjI^a^xAh_FG}VZjynh$b$xJi zzZ>-!DM1iM0BONOFAitGr)jisgp*TN0YV80(+^uTCHarN+gx2@Zs;Dj2(d8t-8qFP zb$loOWj7wo!3bRr>PUw6M|il+1Dw`EyZG=vV%tuJPwyr~#|z(bz;qr~;M$>XJW=1B zTYe!4tWB!$m|2cVSc#Wo)FuBx7x1inX*0OoZ*EbQ;!)pHhS&xXB0E7^f37c8rDSur zL^}dG0ntFu)>BEc4qBd*Z%rsj934Uo+ktwjpL;B(H;F%BdFBKUROBkfPW88(YFt&~ ztRTm=YKg(rj+Bsd*L}qAwLH0cI>8L=&tk0;G4aC`V~^8mtII7$E)B!IKWEB$jr<2{ z(J>xbm)?;)RcPxS(9Y?>U#TobNiN{3bg8*w|^6Tu9f{DtPb+hV5C0D;W%%v z&$YKXH@li$l=Aw2=_FwB_YU_SU!5(x!Y=0)@!~rz6RLT$yDW1}->=-m4vC`IhO1=?m`wED5ufUlwDr8|96tQ(XH()CW48p{Le z4m-sIjyIH)DrM}Nm^oJlEbt~}TYs8yfvlquid+8HM(bCLbm_S&UW^Ll3G(!Pmy2{2PdDdhU`W*dcfDOybCcpqv8h%I z)&Oex!Xonwq+X!aE20*DV;LtbKRu{>u3Mh_$ciDYLr7YEH`QjQUKS8h7z`xsg3G_I zq(oAXU%~aBU7hXaImKpBo1(0~J5w~g=x;qar76rnTZ6n*k$z7(hv7{~|a#T`pewk9Py(Y|#a@ioS8;rG!f=BZoSIm+u zqH_}YZ$}5>=99SSmvpwlQfl8wozuxoGXedmXOCo1+s3%>%_3dW&CIllWWR4k?=%wD zh`Wy{vDmtll+}kG)8E_r+ijXjq(?-5>Of2a)^1PTVn)OYw-TNsEC`D6J z@|YPBNWYOyYI@-D>2n=rfsHy)fTCQAzIq%$0ilZ1rfB(nHO6xAW9^y(qdT>FqO}m| zc(_wu-vzAAgF-yhem~n-jb2Gv&RjGt+p36dL0WN{`WET3A2u9U`fUo7%Ca%?F%E~Y z4(ET2D{PwM2owqm(+SQ2mjF~jN@1;)$2c(Wn-i^lb^`VV67HI5p+S7MAJNmA+9~`H^;|g5+(0$En}J{oXsj~ z^C!cWGSyvhLe0mOYw1%7zr%4s>(`MSopXTD#d<1n__=bd$%{Vc#>h0#ggh%VQ@@%j zotKh=x@vK^1=m*G!uR}YD!QIj39$MBV!4ouzpZh;ZTq6MihY&-@idgJSkPwUzvO3$ zaR>C0*82|?e zk`2+S!fQwZo*NZ7T*L0RDN)+E3LGgUq*(g)(3gBiWhI(l^%L~v{anPkxp%PkTys9z zU{^jZ+BQ)?``hS~u139kS^knUnbIl@qfJ6ad-0#>E*rs;6T;?^w$b`dgUguY@pv1f zYf7}gNEaDL+oGf2y86W06yX5dJ+<7{WiL@}68$z>rkOADku zVPPpC-&zUpKG*tERy0;B2Y2Zh5PfzeLx0ubK$y+{_T3R69UqQ!;PP?23c*JS`2R@N<(6ej zOo>XY%@H0;4WbXa{a;r>GdkF-6KsqY9vl!2Jtk=HW7{}-cy}lNzN0CNK-vl*=k=8< z=-bOEU3k?98j|}aI&h~X&OAcV+|`8W>L#(CXFHDaI-%xd9L`~x0V*&F+V}wL47mU= zQ+RY$GNa*_Q9p&1X|4i=DnCG?>Les{a1k7|L2p1NA?eA|pXF+o{u7;4*`NfR5eFqA z_u0=3gAKJ*Z={l@IQUKwDp$8-&dji$*~1^h5J_7!K!DS8O1E>oH#?UAw$X`7Z^4D` zw!Z)du5gdB?J*_@i(=3Hvw%hmr+M51dAk#~3JmkD?TF8fmDB{;<6|RC<4}~3OM<#6wz6z^Ad8f?p{;R%e)3a;?Ag_I%Qu}Xa@elcMrt- zYT-I(#uRi96)KtnNzu^KXb+r;T=nw2LVO-yhbk1R`iTbc_xZ-c0oPPfU+uC3a!2>~ zLD!))x@!YMk`12Tbmn>2Hb!cQzBxF#G(Fy~tTb|rh0r3+D4hNI+tG^CX1>4s@p7;G zdUi#(`mT-qb$vcx6OL)&iO|G}1}@N{-5{rt0hrdO1bunecCQ@4=eomzI085>GA>4PFs*{ zDX5#^b^Ox9)xL?7J}Sn1>Tx2W+IX)kXd(BQpBnTD!KM6$H2***=!cp>lDO?+<@|rz z6S+c<3pdJk8B@plv8Tq91I}=d4dF`9lP{qqABN;ok23wm48WoMD2Pm<;GO{nyZESo z>`To?*ddOgKKk8?O~r;<7c4yv{L57(c5`5LyX+CPI!go{s8zno>ZPsp^u_9SkMP+l z^CuBp`4D!T##xr*b}5=mJ76x5%f{-;d@#Zb7#L1njRg4@eB?YI{<@qlx^xThE6(UCSc!kIfQn2ERd% zrVHCP;v=>kG-~W*WI(Z?I{bCfXgwzBh}W*5^u3?YI@?g6o&H*A1U`)zPuTz&$WmDXmS@(x@eFC zS8N5Ut{L7(6M&AI9TQ%6W8wWTYQ$Fk<6I5`~kbqaU95^NHjb?ujg5E7sr zFhwh!49|o9U4cN_e$X}pV>w0@d2v6IhhX=IJG$9$!{LfmR(-qshF)JJq(+ACLPspG zpHo)J%&gfz0Oc^_15wpc=00oLLfknaxK!9^P&l8V76_9EZ^W_vJLi@gz(5s?D=#lX z5}UB5Umj2`6*PaL451uMHKd@{X~MhN%)I^+NbeIDM8Q&x&A$vm)L zz8qgM7W2fV?$EFcXH}?tymQjyw50?R{fw48wSm!5YtC0wv)cdzSUhX;FSM8Oa|Xzh z1??Noqbz#RrZ^&Q+X^cAn`?^>wSnAr>Fi@lX`QhJ26`T1Q%$mCafB)bRPgLj*TPZ$ zhbx7^srWu)nE@j>=*3}RTm9w_I9#{3w4B$;>f5F?yww3U*UwckkKfI&j*r z?k!uKzR&A3>aq0*(pi%l51ldBJL&#35C`f4yHh{(Cben~`y?paj0~U=267zW@njt1FPvQ zSB)gc(FAAHkgMNnxbze~z6Zr5Bq-JX=dB+D5bp3r3GvY5R^Qd>*zMKDt#87%N&uGp z;YTSOHx|9<@#Q0Yk76r0*0oyb>i3sO0(DDfc z$9JfKD(?fRIl(Bl$~ZG^F~+W7yjN8(-m|s7{+R2I=0+}UZUb5&0q{*NfXQV>Cs1A& zbi9vS4_aVZ$c$fcWCFZ49)Q$0hUY9g zpt0EqjsmFl`1qRq266^J;}3Uq)CAH{uXydG+=YXKv$)lMKD@Rjay=dsuB02VfWxn= zqwQFnLg}5&+n+5=?m5+ybgZzPt76q4f)MmQPFQ8z0hFh+L{E* z?{2i+{Y%)an1&Cxb2NR9z||!0*^REp*A8m|MQfZF-L60*STpa|x{%)9v0rQ8Vy)l| z2^-Kvo@x?ky%wP$W#+jcpYi(c%(>9kZ7N=4e=tYv_Ca~xQUBqZxm%HK@n)LTh;4tk z$IQH_St8VKS<8th#i!oTXX zg~C#XOB$3k(-y=rFHHpF7Xl4$Kw$#|1`j%TESf~66Qo$SAwHU=vkRnMgn+%;OftuN zktnMK{Dpur!*ked$Q+uf8w?iG`J16l`f>ZM;WYnxU^LIaBSj; zO5L+h`{Nz6pX6$W^F&bZX+V0>M%@-zYIWB(o|KLvzN>AB*fM6kruW$`^@=8SSo?5u zCwtF6Vs)S709!cx=JDe+qgb0TfiyOru`XO`iE&1*#LR;|8D0(qGZBHi8&olenL^iH zk93+j?TGe{dHMKagZ|tg-oarx`Xog&IFL*w>~@$;SAQRSQ%PvsQpOY*?14_Gy8- zBA*bG?_(G^A2e88SXojFgk%NN3O$u-V@-Y!Lzg`g&T%q;y4ocDO;&kgi4QBq8R+33 zeRx2)p0@5MhRTZxaV)Dq+9t^YD|MZt(3U6$2qB8S2x37W>*&ILiYODrzBW8}_$jWN7_dJ5mW4&unc$NMsP3ip>HVp;5sT7%w7*f4 z+})y#H>c_wak?|rWaK*;Uz;QA0^L(3GPeO)bR_5oZL=)l8fuivQ zISysX$a=6%3*DRW91l1d^olCpTS1F!bOw<5Lxmx2Ant9!}Za<+H2{F-GOSv9K8@OPs#o+W2xCV&dgtR9g&H zfeyJUC7SbFr}x`u9Ay!+jB^4tR;lY$nLjaF?%61Pmns=hpSanL2chIt3!)CFl9IKN zq)6K8Fs?Ko5@o#0Rm7elZpi66M8J23v$!fLC7xtqR#wuVFS@eblgCq_rzLl>m}nnm zy0X*`sM_K1fV1_cu6`q4L#=oBtNIOzWh-Ot{lp_yIi>Pvq07w8oiF6KG%C>D z47Kjy)>+1WMJUslgA0$G;Z``wVyjeJ&BC%HDfCtwJNwLW_19F(fwO6*D|ybG)H!!X zo>p(dsR8v1^hiyTb<0J#15dDQK&>o5d5Z2^r~vA4r|Py)3(XTHwehddD^wcF%PV=h{)1q_{!woW+EU2yc-aZ_P#nNHXVao#M?x+@666Hbe+cSB zqXk(Qa9!#7LR5P-J0+#suUB@)yBoOJQ?*%-K?i9$T;%|(;$2I$)7TIjMI9AQ`9hg# z(aukB2-GD^C842$AR1I2L2HP83fyOVdOg1&8+)p7_ZIY@aQsL87wjU?=o@N{*PHsN z$Zf5XQf_{E+h=bV3O24v97K2gV!)`BFQ!59vLnJ>T)w^>I+kf6cUp4TjXTlZ!!w#0ztg+5?wAZIpcK(20e+mPBr>NtH=QetL1UjMQGm(?)B$nu?F+`tE@ zRoGVAkUCvf&_L?+P)|?IB-v~E+u&I?muSp!<1!x5OE02bGY%I8a@5)bD*oaEU3sMm zgK1_k)}#W4rApdtQuS$geeer-U+-Nb78WBV(?oZ6#C5k6WSZsf4n-Hg3X<9JP6H(d zM5FsW3gu)iR5ilr3M59%6MGXTv2l|e(Dro#!>fLDb$$DBKq#Bs$``JJ#nFl>jwg~6 zE}~VOT*7z`mL&}}yMFsLg-Hes5)^9%ZsvY-wOM8wCrNID_l$sp<8ZcA81mc#X%R}b zOMAq>vO%*7Ly!+tx&qQ9HR_!jjt%&}p<~d0nsTG?3hGwGRcWJfJW^I~mp;H1`Flld z#|6YBr``yd?r2w}c)$rx&;dmiiBWc}$Iv1}&MHVAdlKW>se<*x%@nOtj4bJr1m#jz@NbWV0>3ATbEny?vj71t&RufK`8%{UypG+JtfQv=o+o^Xmsd$2bblWTq}oAcDY)mLE*^x@y2}opu1eO5 za&)0H0%bEpMehDoHhd!lDtYd<_B{uqiN??hWgry|!d=>YwI35vwLWl~a;eZAudw@d zz;fj@Xd4-Ldhf@D?Vz{}Lh`aTiZzS0F*5zW(7h7AA6c8oCCcgzfnMd>NB{e`eNzL` zT_O!!df`qb#ETT6KUi2$Sv;>`3E=xU)G;}GU*8!;AwfSCG(qTSeyFTxmO5!`%62(? zKV{`1C9%wHB~p%2BXnGZ% zjB#jgpM3_&fbjQ&$Y_0s(AMDE=_A*b)$FLaO9B)*xBk@4*Mf{XuK zW%Vx9mnG45MTLtw=Ysd`P-{=L?ON++rd?rKdbEd*fAB(V$U&lknBj#8d(yzsV>u^c zRxGDQA9*AOiP3SBsI`VTMXc%S%&0ij_b~8V_TmR)62Sp{83yO)Nuri?r{?5bYZmtH zq*#4k$*oUOUW^~=6LxWQT#}F)cxB>0mzj#x@+po|=#B2o)b|oChr)FChEn2rl$VXC zt~=*>QmW{Un*>4?3?;^16mrV*wBsafPD+SD!}qwwhIpzXXM$s;4zw)mpjH-a?nI3f&da5BQMq0 z&+2|AClM{@b~kc!!_dqX_gFpPZ3afiLq~l}7O2?yQNI^vHUW~meuq`Wp4~nsao|7E z#|w+=Z&0^=uXg0TKYA;R`RJ8>()^zy`Hx)@OJV<))Bfz60qO^C(SFVT?Oe2diQD`1 z;;Xo#pLA|0NqK+f_|xs)IwgYrRHW*Kba{vN7P7k;m3wf|L4G6a<$==DErs?-mDn?? z)qn4_ZcU^sD!z4)Iu(|<@+m6v&GU%|VrD362eF{JR8Md9^ll%b32`$-Zti7wgY_p_ zO1Tu*&VZuF_V%g6XQl7%46E1sR_I?R%}O{#@dgBh;oIal=uZ4K4K3;xa^k(scswuG zIJ&pF!NV1?{4rwA(~OiXuf;is#FFMVSseGH}m2gZ_T#*CU-0B8~IN~h9 zr4^~g*UV+KJ^jM^m7ji=;mhlgUK0rJO6gIz8)y1M>nWupbTdk2utpBF;uxzLU> z7E5lV$S=IRF6OD$f1(2GDp=57TH4*;@BOBGrZR2RUZHqUC05j;x=S)+e1u1xOEW!6 zvq6OvH^J6V`rBk`r&Yo#){0V<93K^~n9@liZ7uNfMGSsMm-!w2Y=!lRvXOjt=lw*5 zg&FOcM2``NifUqfkpn|GU;vWaR9U`4lh(TZ{*FG8a@*4(Ipo)VaHS}%^aB4HO8<#5 zm)SW7xxa}Gxi?nW=wkPbh%00jn}|{Tz|5S3e<^?FXoKTjblziB`96&~>?xBp+O{29 zBIPye8J8pKMSNs1)mE{n8A)&`iKkb_Lcfgk-7kqJEK(?y z<=u@Tm_)Zga>EAQQ6vATUi!r9poOIp2|i$&Z(W3wq7#NCzMn! z9W%3_Obu7Z5q5{MYN?&2e2w!?{vLLbSvRA@9R&5W?0Jo=e0o+H8e zj)TklaySF{IH~c`-RtwKYZ640=-xsxBL+Nr8dYUh-)O*!nh|l*a}KZRMM5BL*f;_%e zCyMQ!_K-<0F=?$Rc5htfH7e^;n(;1DZLG?68GET(?K@5g6vvlN6pS8@nb5@QPY$+k zFMzHd3CZ`JdLe`wb|0UiL!2wlt12viI#N;HkuE|Ip|6M0Z$z?1`n&xRC!`vAETqfT zVQsdEEwIee0dH3lA92P<-NIsgcSSMqw)6H-NkwvIZtnBL*suTbkV&fMJ>d~>1<8aV zdJjz<{alUZ2zGKZ1ySz*$zdF&X5!rvtW-a9huNc?J;ct4M z+j-x#u;x&}RtGhLGHV>6P|i*9?)Nb&@Nxp~s(?eVIJn$(Of}zst4ZW-Y653~$M|0} z@e2XPqxQQPu)G&4TxOl#b4%_G6OKdfyO_vrI0IqUKUgLGzI&$S(yV4~%RVZlyY~^1 z{11X$7iv*`#=v4F*Y4se`tylv z*D7h96Rvtso{A@EJUTS_YOqYznKslslnN*i9F*K#2xw-sMv!n_CwS`~OyeRt%Zk>%XzlH+7k*uyvK z!ER<1y^b3j7<1(PR^MPOI<~%zhF+H+eoK@hzmQvcqCE}dDnRscHZx<)nOs3ZEpW{BbeyXDf&f$9M z647laIq675fM$PR*^bGI`x0NSDws)wDpCG{N%jp;Zyygoe5y*eQH5*Cq{?IW00<6l zk%vhTs*c=C!Z&cvaTPfxBzShQE%(S{GvUgYQu#9%7gSMS=p#dHofk{GXXL&;v}GS2 zu!&2m$p2VF@ZsfaD}U8JW3375s|nV`YZW9IX$?0Rrn1Z1M@9PaT7BYDb=&E8*=_e< zwW6P2zG;#->|8O`(oG^xQz#m$ZeIPze}Y5q+=Q&_<2(MQ*`VvGu45E=2j6i29lVDP zh%`!%wDN>TJ8@V_CaH}&oIS%ciO$0qx`~@8M`OTH_EZ<>*$~9gE+cn^&aF>}DQrHa z`{ql>4{de4q})jF9u#XVGc!Vh3SwvlkA8ITN>t_UBl?E4kImYHoUEmXT*SD;{+lkc zkk(k7^%>q4_{idLG2e1)`T6{iS`v7Ny2lndoHJE$T-DA_5|2TSX|GRn9@nfKE#WSQ zU%6Q@*EYkkDXJ26qkFl$Y*^qtrecSNa){~U77%sbb zNR38AU-o50;Lj_qTLx~`)ie5UMMFLpbUHco2g=&aJuHclc` zEH`hBCX&v+vRQuOso@k@b29?V0m|3+2?n243kcCl!wP63(rr zyQK8Buc9k_xeCJB!GRLK-(H0-zQAgGjoOeaziwgA&-=-3HR`Pt^ohFnZ=6sNZj3Mx zsdD)=eTK2CAFAkUKx!f&eXfPVZY{sjwWRio$?H9Q2dU;R-g7UvwuR{uAv3S2UL&r- zBTKEB%TKHDlJkDZ4#;Jqm);iKYmLXRZD7_RunVe)aUub#A z(orq{O2EG1wJ|k@M8MQ_EsUqUp*wl|O``8I+bPhis;HJzN!Dob?~hS}mYC~xz;Q(tfn!grTmt_ZFzc#pG2 z?Q`ZmWL&^e3n{M2V+YHyt_}kmvmV#QSfA!`c(D!=v_y9suc7nPESuQgw@@@UFDDF9XL`C}K)1>r8Y1)d9L9S84ILXtQ(`fsC zDx~^u6}_gHLONj=rh!8Y{Q(cXqAF4~M?J9e$z4Gr%TLaVk{;&F&w9;|vet9gLUv<> z9w$3RisHqRoF#HOi*BODzlR{!Wo&@EkQF5?Hm3g_jdGkFR{wXWtRIJpyco^H*`*#5(-^{68 zc+TuOoXNi3PSM7$hbCU2G8hrEMvlyxzRDQpD@H%eduj;2-4!@diqh$D`57LgBKx&h zxkYOtV@Ym<)|ke-PK&P-jgSp9vN zazX208vjl|ma3(&HPfEnd7pN^?F>?tcS(p_5(&u$+l$?F`wnu9f|ZN1z<9fJ#X`L0 zZ1k0Y^>jt5GI5K1!VAi-5RmnCawL*<5BjCv)AwuSnCbw2a*RxR^wRwg-ER_-)rV$0 zv>-uLoOWZd;uka{@U$EcQ~bpP!d4jlOI@6K#W&L~qfu>!w%jX4=nY!F?{Nwd-N-Dr>jE039LKNH~bGzIyp^Z!N= zw*z?g9k4(vgDk^dZ)zh~V^d7#FSJCoc>UbQ$SgkFjA|H;?f2Qz^s`GPkjma5YOBy# zvd8U;-b#_iGm4ddI>e1n>dZ6^=>-8uYo9uuXMOE-j7B!|P_Cxp6>mhg7n`&S)(fEu zg6Scnp!`e)u3`hG+@&V*)!)~IcmHnSzw&ju-Cj|PYf-Q=Cqr;Jqq;7p({w4{V2ePGQdnKF zAivQQora2vMDj^>S4BdrXGRWU3T~(kaiSs1Fz>zVyli{x@}ywNi;jop#ox%DHDzxI zf!?aA-7|@O&JvXO(hR$Lhz5x4JDnv6krSenGK{O1;+#vOPE%?A-4u@~chy`-T=4HD z7!taM+~KUpz0}UlMe^>JL)q@*;pI1^q0~jW^ZdvKjcije_lSIoao`05RJF49aQbU# zTG_r}#wU#;zmhAf?W3lH;bo0B!wgFEwaE}5Me_ugum;z*8)f{+nl+wd78dqa=io=bId^Mrk*2C})yoFz|ifss)CUOxA-aVh_@yhhM_G7IKaN=e~j5?(P z(?7Z~?6fv3A(|t5z_FdvPY#yQR3mA66}|r0QO1-lD<}HFOx4(a)#JS!KNY7}S=)iV zghnRb+WXz?<929YbsW(bsmjH|b|x<;zLyt#^jgKpY(>GL*wHHtDJvjcQ?x8~5zNN| z6+D@;D3&tupsV{fj+O8K_?Q3dMf8g4DS{KHPl5)WP}T2E+Fv~W4@!!_^4yT+^$We1 zWpWH|w1qc8zoMUlt;XYfIGBoS+WFzt$A7&-TZY-m`wrFs%X~&pqqVHkaP1C)Sc>!VA@gFU}*h zQq=7bZ`HeA0JVNFB^8B&)f8n<=AeE2-_glu|3K7-9@SmtR*Ylpg+tUUxACW)kiQ98 z13cFw7_VUa=XiDabI`A-B3w;`@FdjeGTXKTu zYPqi0_iq0Ge9_qDl{uKRC#zHh@UNZ&2L1Vig-_9mx8cMmzwTWb4ePI-t2)WH!cjW8j86+{(;H6uL`8QjX2=9GY)l&9s z6;040qW8W4VRWc27nEOvcTDHY8SE3UQxWxk2RX=p=|n#*TfG2u{`6>XcVxo8FJUcG z4Pbi^W1Zg3&I2@dh6pbs5yr_sd!vW>_t`3DWL$9OG=gm8Ght`duJ^LcQOVF}L3~9% zd{ySmG0zoogt(mFhr)?@N$Db!hA(XNKc6VWzs&-2#TsGIcTCsuh+m!|y0a5x#GX43 zP%o@XOGi1$u>uX;oxj4^Dg9lF)?v_Sc!CzuZ~%OwmPDf=P0+Z>&^7=hR3Z!K+CIHO z&A0zr_4>~X2)#*=dkgAp6LD`FY-fVXb?|xvi77rinP9d|1e&c zS&^YwM_#}QtcNwCb&(H6qF}@!7;N?Qezj+@9t_p<0gHXjn~8`*4ObxQC&a+6ITUFTL-UN93(` zgFag9v9lcMx=8_6)vr)#Ula03;%Ydwy*1FP#~-en{O- zd(`N~v%si{gK+Z-Pi7<^NcmCC@$qJssV|AAVzHVOqw1x8LA)`1?X2Zb-j^D0s}j2) zy1bKR%;#FA>HsxC-_AAJZ}2kn4e~X%NnAH7+wE2FJ8Ptm!L@os3T4RFp4I2uQjVlL z6*0y#5l{Z_^Z#!Stm3Xi%()|U)Mjm!x1uj;e~?&FIVkb$p?yprYi~vOYN;l_uqN|X zWMlmzcmq^p&lpwg76~=RgR8I7^W?jqWXp^mpHxQv`UZN#^rD4PJ&Dg}Ctw4k&2qjOh(@a$6!8k;@F&pK$E>IfYYW46A3^Xq27^c9F=eI1i5DOXI^NWi(-$N_*tSM zqo!K*UN%$@kKmsmuuL?#0A7pAI^w_ys zPfrei=1XOx(a4Fny!7;`OHrLYSqbN>fDKWh`9rT4FEfpzFaggiNzj%e{!DGYE%V5S zb8XkwHI_4YF~@B@Z?qaQmD@8AFZk~KRuwIj`f+Uc8#fD|NzVt&X<;5LLTC;Lq$1&A0F2_~p)< zA6G@ahyZ1yD$%*(p#Xi@D=#U^Urx1vKeKA~(Ejs({@`4>Wx(@w7gZ6Be7#mzRx?rU z{8xa^_j3H}PU(-05IVnmsgaf?*z@8=a`Z%~vXPl-bPP8;D`UbG=y@8Sl64Bmem>!# znyicAtgp3Gtu~MD?VdaI)A^%64!W+aqhGQ9O9j>Hn2Gk;wyREW&y=O{XIjm|9<2Y};|*A2ls{i1S5MNTp@rxPuF(ALn-JuR zQBZ~F;|Ji3VdQYWbNnBYm(uw&1;MV$7XM;0L5UbVcML=FWked|qU7=xg;w8KMU8;L zI71L*MX4z~L8k?qW}|uOf6$X&I%P(VfU@I(InVIlo7;^0GEco8b9i2D%cWs(an}USCXF1xN!G4DfuEg!`FBYWF2Q z{B?Xw)%j-ZPo5}SL2GVu>cz-RfbYhN?HYkp+is_ zL_u0%0BI}~QDW#u7(iM{8B$SFK!#F=P-zAj>4vus-s}Cp_x5-1$2jMlefD1YTXD`f zKRf*bOrl!8I&Pf2MXn%z;wvC{Zhsl_gg)P+AHMJIK9TbLREk+O-S|EV0HUKJ27)Q&l6A~KfO91TLoS&Ui1Y;K}$FjjrW1 zR#T!!Y$U>`D(4%z~lSKqwxHSQ1uTUia_&ah#f#TOrZH7 zh2`3HI+-(zDO6IlA)vcz(*fs2{!+-)6xtg;G!W`3*iZsF4?gm%-4#$ztHvjBvgzGe zG;(d0=SmA)e;+DlX;|J&v=e$kj22vMJ&`Exk<}hMN5`$=(Lh8)`%I5&5j>er?q9Do ziwsj>+$6$ITAnA8?lm>$gyRwBG)=h<q2L9T|9fx{g!&{AQv3TlfINEwVrCA@`a{^yRXZsYBL_UC}H_D@C<+VZVBd@;L)^F2t(|Zxw$t@fCSXWW<^R#W&z4%H>;VaS!hnR|r z+jd!V!B!{&9nvQEj=*n@!Ho}lxT9KWqrO?NggSQoRC z(^R+E8X%W5ryxA~5XrwH5)^6xJsb9w5QY~%onUOxF%TO=Zj zK~6Fb*XUy?wdIITF_irFlMg7^DrevN09NKyt%>McG?F^9mmEg21qQ`q~7<-w68qu&p*l9bSqKPAtq>aKlnN#kkBxfg>0MtREB0df= z@z4^qDsES(VepUwcna`Vq1VWIH4n@X@%bP(J|qkZS~_R2wfuhRTK>jF`9aIk%+~(* zeLS|$Bs9e}`pFLOdFtZV+s<0{=?9KhjM0-D*?l<1#32K~X?kIuZD2jFyK;`5L;_s16WZyL(}r#6QqTcH@tx_r-y|t)k;a0* z9#L>jxn8}Lpa%=Z&$7y9dULCO7W3rFERNL_f9rA8o?=rjdEhW-h+u>YQU5;CQ+)K8 zO@M>(B}*Rw!a`vz5(ip7gjOGOdB5M*0@sQz1zZTQDn{S+%qctYccvf3hmv-cJfLJ| zIb@%0_`!I8S-FIhMqyB;nOx;a9`rU*iNE-x;Cqz0@3{r#lwk8D%c>lr%jTn}24SC^ zTE)#`zwbc#PF-lsRB?2HG}7~g@S(z-4Kt`og39HfOE}zA8Ko}8EUL}UpaTHf{9c`U zX?7I>1;@Ia;Du(NJyJ9!U7AKLAApVc;nI4P>E$Bsj)96(OWeCHU70G1bbIjwN~0!c z6qWnpuAGJUHhVeU^1u*$DZ95QQU%F7(^%<T9VoYlnVO&40t0B?xe3RYa3t4M~RWx0ySa6Is%$ihC>?8y2^<(I#<|euOR%l%>YBgA(l4H$gkpo7URPJ z8rewBwpW^^V2ZtJ52e^y+jXE&GR8?A>j z^C^ioc}%uF8-}-ZksI|%=S|C2dPSX_4tau)>hy^EmxOul zKqs-{-Ker7;6>Iv)!9b`+3J15xblqY!;&opxOE#%-7Va0HK?bQOkd`|S=_$|l{DIH z@|M5Vqm6WN^ksmc&xaqyXkM`XlX?mxBeA?5y&YgqRIWj-`OZc}D#~a!9diC=byVN`gUGGHva%ubY%ATwdI#djrN~bVU7Me_2<$>Yr4hf^ zQJmek?!o_U?%K0kHHG7I#t&4sEyU(}(X%RSNB3@&FY{7AIET=lm)WEjuDTGX5^Ac` z0L4~6aR$fIQTA=SIIUv8axeuG8w*BZ_IB$d8RVIiQ7xTR*&Esud{ zVbzJ9sLM<*@-uN?AivH(J{2<*imALFrlaY4>KlURRc@B_de@z#EX)f1Treqh4p{2n z?0U!NQnt{$mr!@v=2aRfcj-`mUE-X+!U{;Su)8{BS43te&|5%OCy0!YC()v+0Wc#% z=h^FlFeGrSEgzdyUdQb9EsD;=z{8&PJ7M{GjS1oN0=T9@-_hrR#myYx{7v)0?$Y8I z^<8Ovo7cCQvk*ae?2F9#RV0yJ1?NWBe0niDc8)i$uk+U|;(I=O-0+;3Jd$`s9Kg0L zq0YB;>f`sCMopD?T&ZRJ+s|tz^gq_WKFo~=R-Mf&U6B$=y#z9MRIC(ot_JT6a9dzg z1L6#n;6idN!&N4ac{4FE+m3z0bj~^4;G=(@Y>#VSiWkW) zXJB;v`VcwKu_s%Ub~Of&1Yd?Dcww=*4(wsj`xl~M4>8m@=gk#}VC|1@$O7dB8i0>;#583gyFv3 z6#$+t`h2Kv_b;$yD*b$X$YE-MBL%mFScV+Hi{z4g=c%(0Zgn$n5*cSE9#i$YEV}Wz zlim!y-^P^-p|2TU^o_3>ag?R}+Y6x9gk15s#POspg3qR#DWnM}Qb)6>k%*~4In>Z( z0}(L5Q#|!Aq9Pf^?jOu`$r3A=hDYbX{7x(a{+FPtKHM8Qg!H5-I8&L;f@kCB;#9&E z8?91z#tHKF-?HgZeO1V*x;N6beaa>vqs+nS7Z&_yv{P;QmGCgxW`R=-?3fard-j#n z+pu37LG!TRilErT@#4-)hMs&f zCgeZq(&trW9;%WjwpS_%fK%>0qb|Y6m-bQBNi_{XYn&zbRkf3-T1X_$sElzVtJkY3<^{jkzFYU(q zPs4@p4A0hkPXa2BG<31+ckYpQ8ylsib?Xby(jCoerVN#Btvt>)EENaw;m4CjH!68n z8)RjT6Yo<-p+38mffTD=78$t?P>5*t9N-*3D9#(?-y=|kUDN9`i~0uko1ZI+^NtNT z0iVI>nD(XU;&;z`-{z3PL6788_`V=^?OS_PiWN9#$4@``ngPZHL!|G~`(zZ(v1n6g z1}C~5(^FM^p1NoIzyb;Be>jnK{lIY{0$M;>>w65;dyou5{?Ag~BcWICwq}jIG{& zmEA$;l|cZjCJ2q8E`^BG4t6#~ospB;&@5nkt2tM6aFNhCOzCEN;-8TRoIu9QnC>nn zl<9FPwuT!3w)zN<`33&T$Fc()1r!zscH(6|B(pTbbo9VX{F5K8{`4E%7Yf@Ti0jqZ z&S>zzL!v1d?0zyi5~#~`QhW`SX)Kc4U0Tv1OWBm1kH!#fATV?wvMM(-_F;@@xcX! zu=L7*mR<{QSLXj7hRHSZxhA;X01r1XWrVDjD=sQ?Cwt1{&^RO4eYMCdh+$MOFFu1@ z%$qiRVE)a&M@}Q>f1gK3b}>Dg`6uzVeS2IA zz}+5pZ*-jTe0w!1Yl$+rxopT6(x7}BH(!*_;^fsKxt zNwBY&{?FI<0UH}Z10%4J*%hm)+X@xP3M9_~gI`(-@pFUKG?3RzMiusFmZT1y5r<9%jq!%kPd02w_;?I^y z+Z7t~<&Cq-;ddG$Zes?NiR6_B%Vy*G*l{OJlCnuf6;gbJ@zkHJwquG-QBi?eU}bi*%lZ$bUcl|eGlsLj*Q^>`|a}8diy|TQa_p# zAT!__egr9`UF3K6Y9qDpnS_OgwFfygU22(A7Qv?1h-DwvLc`^DMXJ$(z8B1 zDp<&6;`0r(SDlJH%2(1Y5^oY%D$PFr*rj@lT6O_$F!W@2At!jgd|VurgxYw-^qWQ0 zX!n;3qA(Y#G#HKEc!Y0usrKnq(LwoozALX(S6cn@sq?^7g@~gOJ5j#31Wl3kX~d%K zMBqB}2_x9cS@a&%w;fxSY+mOrw9(vm=#7C~Dz&NzxvU=#FLXxn?i@J+*!IPNvs|b% zkKTfyh50I{9Yp!=9F8dL!5-lcN;;0x5ZVV_J~P|93n{yc+{cs*lguIXlz$j}92I=X z3~0`Ii*B0}lcL;tt#=6fqU1FWpg12q!J~YmRi31h%tekMOMPTXwQi1ERqft^+LNiT zQe`lU%(LeeGS7L5A6tT$vRi-7ymhYyy91?BEe-elGucgKGVJ#qTO9H?L6Tn_Y^UtJ zJmTFqyLw)QZiiDNa{tTh$Z`wJ+`JOQJD3ZsREShlzFQ1_N(d*O4=-#y#&4MsXkZf; z;CsbP(c7+%cqF&SrpvQwc#LifK%2xZ?(k95Md zs2kEKPDIQT@ZD3sGGPr5%`Aq2WT-Pn$l|`|@7h$?H%^={cq?=nTPOQL*UM#%}&i?j~u&SPl_t%IX93su( z^B=62enl$mRonPvY6X1R!JX$2j?YtGeU7(Ab{BlG6Sv8NA!qgln6R9_I*2rta@NXqjRBtva6qW+!emknKEAgRbQQPA?;w}?kn&%(0xGf%dgJ?1(OQ(j0b!| zv5G`@%&=b*Y!>f`sXAw6SL87>6Y@|yU6n437btVN9}$29OlDwjQtM_{GhxZDN~_8E zr)gxk=t^$LyhP{p=Umut3hS=)10xc~$W_M3RWJ5zUsVJ92*KV2DGo=Nh2l6LI?s&B zg7pQxIus{vNl3bm=*z4h$gzekLU>N^i0&m{d>+O_0?SM z3n~Hq>fi#-fVn*`*hF5-#xF*xn&YJJQmqg0Uq1?EbG9b3ld`)KQNO(iOmI>{Xki=8 z@|r3g?hq^JfS3a40H@1KgbwdjREo%vg}vZZP{-dIpuLiMDwf^S)jlhOfYx&%1j|6g zKk3p<;{hr(6K+V@2#k+>5{6g-8{ZPXcyHoaT7bU-a{B4*(-8?xx(DK~2gIbol(Ff= z09Sm^X>pCq!X?A-zd~H0Jr{7~3hAeLHQoNmxT|9c?V9Nz9ei*h`I=V7!?QZ zv{-3X5HpDLwx(LovFc9*68r84;_6|h1Y&E^USDaJt3pP+H#LcTnDdeI@)AD=Vk*u9 z2aF=RUE}c%%7pI-VZx%i(HogezpJeBpNp}xFoL2_`?DzHIN~La0;Bn(nST3d5p$zd zPvAC#h8I#LZhdCWxbo8pYZuYD3zdWiS(89B9f8%O*n2t0%Z`njn!N(85}oz?DECMGF)WPHOWmooeeK-yS)Exd1Z<6 zDjg!sbF+`AH2IVemS23`93)MPz~{CR8yxI*CAlLg_~D5X4O)l4*-yw zOU_4|2;;~+D)jcU;@y`VlNk^b!Y^_9NotBfR*OU*IAIw)CUUH5I3Wma^p_I;*J1LQNoynVha$px!hSD1P(b91R^@j%J1ZpLOXhZr3%*OBb4uI_w z;?AS&IzR<;C%r8)FdiTnPQ`&WKg=h>$;66GEMu`x`I&if_ec>uXnf%1@Iv1?t2}^Z zsLNfRZQ%c;=_C;0|K#-9uviWh_i{h_pfXz@qlZKjIjg}E0e=S&bzhBPFR=qaXqFX@ zY&*a5IQ1W4!Fn$RAe$~%IvU}9ZrVa;C2JqRqWl~8nO?$OG#`}V`4DXtan(;~j^BZL zan+WeUV@tP^6dDhv4~86uj`8R1-mvy9ktj1$blT5Jn!jUj^^SV&u98gi!Q4G=_k&v zqBFd1wfDY{?NH8l(f}W_2MjoK@Vtx)056o|$Og{aglJ-E^Gr|GXb0+PGeD^0n>$7O z)!8bz8*=U))@RL7`^n!CvmAf7qA-2Z*T-D#1=tZ^FgvU`>G&V&DY$Fsr|4H)jLCr* z`Y<8%I1?@c{eFN1F7mp4CY<_PC0luwAVOKF4=s;hE5Bu>$XrSTK?F;Oex9g6DuCNyo2aR`UV3B{TgF`r=}l4Kd8~ z@TqHTOpYkjzN{~^n>XQ=uD*$Ga>S{$0MI%&r!0KyZF2?Bht#O&I%hK!LetmF&>23r zNWLH2cd3cWn_{PgF%>I3Ea010v+-UBsM11;%FWXYUAcOt15~U`MBho}FS@RLqSR06 zT?2{7fQcGFdws+*0nDQ?7nWD%_3YSMvMe}8-wiiJ#(}`$1s%?E-tn9?8=&vC^7G>^ z5D*v2j?XGC)<1E=Nk>;V&E3@qI}k#ubu6_Oa-HtQFT8wd zOdP9EJx#83TzIi}uOAvCE6Yk>=BYP0c;om1YGvHsXMWBrv+rwbd2Q}qDwiCtt`4r{ zHPPi1%6|Cp3N>|*_1(L2uRolnK6J ziB8kfJ8p*7Z$Cyd(DxoA^=4-L%;BLMX^9s+BH7*SIk@}UwQJ5JIRWrfD_sVbd=rx^ z((y75?`9nLmKp;u^mO0D_Y_qAqpM z!5FOFoFtFoS3L4D-nDW>SkKz{8$OL)x%ptssVV>LQ$XbQhfWjTDL14X<}=q`89Tc! zO>9+q>u)(vs8Z9=#PYt=sNfwxDe*(yMv)JU)AsOvWa{Q+hub8=z7EuYtj5UXU2!P0 zf0#Sh(p}VVQ+UrTw7hw)L-NRTW0Iu0j!t-*@}6Ya$-GIr8o4OcVXR86B7C>=?`s)biZS#F9R&u9@R4lVCdj!Fn@o%E?O{MrTdFR$J2vX(wyWlRzRhq z{*_}g-D3osyf)|l6~c6n&5&IJpTnGFcx0=v5qt0n%U0u#3o_!Vk!5NVpDyH$e_K+k zr}0yX92UBQ2>=^(E7O$|g87Kv&RwW`oFtlMyLNf-CzJW*m1MSN0V68ZnY^n&=YH&w z71*%Pd8@LY7a1G0DOyWetr#4y;h~9jH-icXqpzPUy^YGh<;~IA##bG_Zemh}90O4? zDnGT!@Zo&i-IlnE%{KXkKVq%{JA{t-8nfoP8VjMkNJZWJM~}1FDU(L$hx0s}u&31u zn`oA0q9gCA$~%Ols;`)Z zMcjp|8i?y|5g>i~?~^n^GV6hB@aK)2St!U%j6~$759;FV8rV3x3>Wl;R%hWqEJE=s zCmxP}=$O2%-0>$%9<&n%zJ7haO11aIAwTx5Y1%EhVrm-d3&-g`@g>>$4s)mIDWFPIBoMv2|v z7;jg4_xQxWB8aMsIi^ z-AZL+*JJwArTDfsfjw)o^c6yBAt9QGVVNgJ!5PB*{BLG1+~^o!p)p#c+UvY9q4V@= z4LzvF>(?Q;c;okAl)_J(_&E?h4ENELUoq_L(#=XPH*|Iu&dkZsva>6iAd|1(kXUht zkG;9#o!#9Hf=6CgWlqT<}z{xZqxzNzm%l3D3;Uy{>cTDfo@+Iwv-nd}L6Z0-ZSN+~4&? zs~P+Kf0j`l!kx!AE6>4y0aP?IGc)deEq4n_V<$7%l6VL#h5BCIq(1%6lC}F-tt!XQ z0sQ!2g~JZ0h@Sh`YyG$s(S3t`JZKv>9Oz=vHy$X|A~a+3D%1&k2RML@m)am`70%i&-B;bZ?DjvFdLazdyVEzgeGAsBai z{6MoHNjem#I18AA{N-2wP4@v1-WB34B>(4|JST$LlJaK#yV>;RBqX1Axo!3G`riK* zHp77Ae^Bz|+-2&&GrcS*m(Ig)ClY;=7n~q|@tXXfYko^3A(3ygsMU1@;r|&NraiE% zV4J^_#KC?V(K$k3tx%lq7kKjcVuFrBaJoJCrz|k9wh@nfo-wgiJ{JjF|2a~zy&|^3 zNLD%|u-P6_i_F{i#9jGogay3a5V(c9z31;5=C*SapSJ0FyB92@>e0W)3iOfOAxcRt zOYZL!+z1_l9d@UFwkAh7Pe^P`VPr0||Jq`*>&tJ!Vvsu@mXF=TNnaAfi)!g8^{ArH z-6+DybZ9+Lnkv0eG^lD(*CIvu8E@lUBhhUQpVOLl9JLC^JGSc}7sKGR0u1GQF5i5V z*?GF3rGmM%+>6An&9=k8_q@QrSio0LG#bK(U@4C!CM7Ed({IiHty^~6*O)@m52fMQ z3wdJ2zsnChiO?k9X3$TE%WfB=sesL2BBp)@dGnooku6UjZSM*vWUC)Yw?^WS?P01E zfC$6)5?ISe&EtW&uqFHj>|LDl#@u#B$tRj3$6JP*Ivl+U^iK*a<0efNIS9t> z{<)#P$kXFGOAHla9+SdZlzlQw0Wn3l zRxV;fgO+ZJMAWw>NYVo6c|n^z3F z4YThL-H7=XVqV8#Et4@V>fYJcegTs&$;)F`p{Z;TIab`oP-L;dB$hKM*WGZJ$A99k zUPm^`-Y8j^Qq}&h^^SPlz48#Bl0K;lamUGJd|hiNnOST)vdlOjp_TO(i$~i+bD($5 zF)3G`fS684FQ@*^)+A1$2t8vK%ZYOZ&P@ca0JNy#n$77cgu@fxikur4*QR~YseWH$ zI$g&;@Q^u#-=wwowP&R#h~ZoM*4lHO*%?H$iH~Eu~@!V+qC^Y$bc zWIpZ^o~uBn!Um_crapR)WhKX?+r(${Sd3sgH(_eLN+!E_QSDWbNyE6g$Ar;@_d;o$ zwBP>tvLzePq0r*bl}m|Z;u%a5OLDTfXxrYmN~99IM$YBvj0lyiQzX zHRO7JaA8h`Q*Cg^?ECqlW3=Q34x+~~YvA}4No0JbCdhKC*~W@|RLW=hzVl>Hj3cX{ zL6Pl1F{V|j?7~!N)bM?)wPIEG@z3c+_iHi>S-N4G-hwis_z0pOaD8fCCs?yT?**{j zc#Qn?tZznFcBL#|#WGgkq^p?Qx@+zkOQKHegV3pzn`$-%mr|*1Ru=?1{p1@i#2iUA z*=#JCe>c$g`dw3G3Tb-fx6$ga0Z;w#6DpIDb_i*QjbgQFFsb)6uxn)$3|YGLUNRZ4 z+h3$-Hx+O7R2Ss5=bcj!d?9v$DV^ZqUgYBC(c}E>LokR*=+fv#J;k1PHa1F$K_J&u zG|Zh-lu88&muXC?lO}!|1nbUxRP?4tsJF|cO}EVLa>46qt$mGUB7$ps(%R)TUOY)V zh_Q5+4HTNh#mAkKT? zbzisJf_b_QyAjGtnv?6siZzS zR#fp|$72=;3~qmaeBzk)2FI}#QOon(@l#ISiy8_&txQVS*o>n2Kiggy*aA7*WitS(jqBzsmCx=x(L= z?>B)eU(A>@r1CeFJa>r^zXiloJjE|W@Wm3VUrJK7OFaX_lAb}M7dtQ-5qPUlJqxz94L zA+0Pktwwk!1Ca!YurT^APM)g;dMQ|uvl;j&?dxcX5H{SK#rogNSZO(Z=161rneivD z`id7@PBR363wUFGgA``|?(x~2a+|rA73#l6KdCRBLc}zvSbiyFBId1sf{fKKeAJNa z&Gn6R0~UW_rGNv7m)3Z4Go?ch=OrEKU7R+kl9fAzQFck(FDiFKsZE@v5Ltps^fg)EU__ZlL)+JrZe8ZUCD{X=M^-ZI3my z&}MWUiGCq0J?{Z}6x#19(%NS$tCh~^FzKbOH`h+%*8$@Dan35U6@JS!&)%oCE=|%U zv*{GNX}9s}W~9aXQbe<`6025@jO47Vb)9h2AdxI{K6eSz#o0`g)-T^-D@)8V=xWY< z$n|t!-=M=l{u@2SUe8LS*(UvCTjmdh7+>@6R|)lMJ942?!GR!U1?*hv+j_n@ErDm< z@BWhQsF>y_QW-^~vHd7^x<9Xo%yNq!0gh*$owEzQzO$m9PRjq9aGJRLC+r&M;-Z>0 zVkOB>y6fZ^PIB&%*~FAg>yy&DJ$AO)mGt%|*HDRLYtH3;XgpwYyKfrSmMRp!(Zxf? zwVVmgyRySye7Ag>kNR+2f^E!_VsK=pTzg5Hw!*p)xgcK4N4$Um8V&`erb2d>5yb8<`It^Xk!uJz`$}KWFSlnLyN;H=^b+J-fAkIJOIL?9vS6exL z4b9La6AGqNRjkyZFQ0eVSo6YB6{+LKzr`!WI#^8K>2t>k#o0n@knA5WaV5{Brh0*SR%c{NW zcBa$PCYOUgt-V@KNmJi`_tL^5SBt_;*?eX_e`eMjS~(JJ7{SnM-a`Tu58qlSqo9KA zmZXAv>Kh*Tca^IQAC%@O3i`)JVe-_A-!7gbb~q4xJui9Ws=MY`wO4Jf(Wa1M=vvx8 z_$-(AJFhkGy>LM#`ibEY#Pg&+R=WLa(s0%N5e+A}7z-?8gT*1m`BO8@9-b3p-#HQ= zTpAoL0K^dY1m7UemwF7R)FR%`Q5F1skbUB7*z{57Ru*r`L36djz4l8CE7S~vUeiY_ zbUoFsoZFqs#;d2Exh&sidDQ2TlF+CR;g|Ytn|`0smrMTKkC@2y?*Z?i_^;G8eW-4y^bJHYnr-T+<2LQiLKo~m9j4#c>LARxshz1 zOnp!e;`kHo!b8ei)k$614&7CZD@$X=dz*6de1@F}a}^~F+1bCph(t9l?JJeLGWlY- z$wFAiF8TB>&@7>;Qf@lup^t#6_e<~rnBvWu3vCY+jc*Hn=XgXeo!qjVB-EO65%v_f z=)lmTV-GD2$4=)n511+m*?q+VNHK4e&KFQ$dFW8dZ-uwHO`R}K|H_{}Ib%L8ra>FT z+s)i)Zd2lzUjqk0t&zr$U5Wz$otCS*L(9lz_4%|!3Kw)RqEMFtj`b)U`A2EPwv|?I zDIlUd^80Vw8p(y+S#_^p=78OGqQ~`Thqn^Mb0WyG3yYt-m2lQJSqt!Z(S)lvrFEg% zXFd1lgpzDivIW@xiy1YlyaN;(&$*{uq;rRy~jd)Xg>+!6Hvj^ zL58tv>W{3H3IrT|nkOW%CI^B}%s6)2>|gqMy!|QOKjKxae|u235Ey)a|Izx{_e=tg zC-{esYEvSTZ2j=Wj@L^Z#tp{1&R0IW?>Q)Lyw2b*;_>)1#fA`CXC6dRzts7;mO5*G z{b$_*aj6OqE`@EfAMVspq zDv_EOk5=%FSoeKiZejl(M6CxJ`h5L7-Xm(p`t|m5ryQ{X)-~Q>DhLS(zV0|Z6NBJt@U9l?>(1~A!8qWL z_1}3$i@VtIjE_>YvC3)aU&TGe6DPa;{Cx^~LF{zXf)sD3(O#G-QW5QwBm7ztZpYk$ z5C(}$6V^Z02==>xMYyY89O(bFHqm`Vqmg=exm)NIqvE(X!jl(~p*;%!Xb!$xq0xci zq~4P1KatqC9pe?1Uun@B$)Go{q2M4Py-~Khyo)8K(2JC~`D$~-p~~V-CNZqFZDt03 zQ%@Cs4t?26bxAs|N&I3sH#$761r@@}!JM~0nkE>6+4o40FjZvsa3?k)!&Uhc_G|{) zS+b{Aa!3r>JAw>4y85FXgRB4ofICHGiDTj0c8cLlL;IY!b?M6Pcye_Ep{u_L)!BOmh^47Y4sar`fFs>EYIWc9V04qIHi!_ zT=O21sk_}2lXfwJDkF_O^}&k8T%7w%>|$%<3Nirux98ukyt zUb)87wrCg2{_30&fLOqW$Tt|90Z``9wBhd%bcwrC6200^KhOKzas6Zic4;2*hhuXE zknuonRd!<_8Y@Qut3CfCVgVFGow(8S;VZuT+u;3lBL>)s@2_9@#gNeL^oRKP0*3vD z-OV#CdhL6Lw4l0^u=0y0r+knunFJxvLde>toI;iBN7Fm0Jc&OInvzE_l$x|O{nk57 z(a*i80lunB&%8x)16*MeZO&SDw9aEl4DGR{CeiOHaqst7n6Fcs9*21mgruSBlG!8| z%4l5RE!T%fQrT*0{0dz*WDy~m_V^LP#c}}L1M5_V<1f0}N}dn5##V51pWD*ivQ-$x zTnr&BRiDU+9eWJ#fhVUKkw)aYZ9;PeUtL7F^M85t%=}KjJ-?3Ix&O>?9cM7v2*8{j zhvEjrABWFon9Yo`ak-ABMQ}SCW6<6vGeO~b;ubaAA$E{8k_DMPNUOeo2CPnu<}>zm zW{1l1U{jIjDi&eAggZvq+guv>o#3d^M{(EOaX@}{MkxYBp@seHY4a+joraG^D!xO~mHIGyqNd`HDb-_lt1hZOBi?7aT2Gee8qx@fok%d*N}|vR7MUn=RGMj!DQl6^JAY zdt1+sf9#iYjyky?!&)SNO`w(ptpDiLjE#Fxz7qB(R6i|#hYHQhowGlVU$OFkPK#kh zpy9nSPY4sas_wJL{Q7X6@+0!t{9Xfazm^pP^*g%+rF2Cgrte{%P$UODS?;c$eLn`j zWC?vDm;RUFt+uy`K=5*Vg0F3vS;&oNwAitTSc7DeF=hW)Zjqh)LS0|&#K%_8jUNX? za}Ahpw6yH;znZpd!1L?}p7sLQf!AToHiRm+9)-$J&+tc($PiQ@t+#UObzq_R=B23z zb3B`+5Z_M9n4{z~W5L;?4`5gkMR3HumCSvj&4k8{ee$L#q>Fr+J*(N8WIKOLwJ^wV z@oN6#vr>!8LtJcWYi}d629eigX}pi?kapDi*C7>z+cTVeu6_N=xP(LHm96DolLv<{hotQf0DB5#MV|>l`t|^FL!jxoG@6g!xXJ_9CytYl1fT- zEE1=b-iH}pRFg191J65Gp9Ojw%_<;+*5ZhhA4B;WyG?VppxlKf}XeAIh zIlKt~pm8OcGX5pjCz(7HMsnzVYprY3`}GZC0}sUhudU`_P_mm6y&c5#+ayfLln`k9 zpnFP`{6ogm_#mB-e96Yz%#DRgVFTyIN%_a&CnCSAaWD_Olf_McG1IViGt|CX#ab8G znt7}VawO@!K7hO1Y1}co3Iy#Qizb!PK5*ZvrKEyIQ+S*IN#5 zy&hQ4k)COm8nJS?x(nNi8^kJM7WqxyWcs*>z(5LT@N z(V?ZH(_%6+jq@Bok3~F_c3{nlnl^|&H*+}-a+(maDwWAz%cn@Q^yYhaG2O8s=D%@kT*?Ax zpkKE6y6~z5h}?roe~aUax(c3kQT5X8)U-x*$~MVaR`A5=`Jso3d0P~J#{Jn zeq2V00DBmGE99+elJp#lf$9Of*uCF(KQfE?r-?r=fgBna$2g?biT2gk+&@S!P3GRs z>k_ugZHKx994b@f$?&|Zs9VBxh;9Ay2^%0!+p*t><3>`H32N3LRoWAtW`4Cf;LhIl zwX*kihpOYd1l{2PlG8-`r=UISR=(G9ACEu5r|`yVly%L{`!CLMGC{?XN_taoV`gjB zW}}6&QOf(uNW@61O&q+-1xinLOP{vF2nVs$!{_5Y?zZ{t(tI$!T%!cVu~?<_hI46IIws z7?Tp{3>5!<`1D5NC2qU!o`tENGRjx{nF|-^s=bzElEYo?)K1|nE*`v+OmV9j4P3m7 zV)CdghAM7YNlDdO0vBb*g&*BCsGEzPcoH@#$((mMNR$EhD$U5PdnD{?KZu_dWRRot z=|1Nw;~G_O?69=K7A_3V;dA} zQ&QuUcz_DZ8J6~Pcn{rE{)fos1nPq-51{_V$q4Wa$8<=( zCTlvu7^-iHvtz{Pfkp=H?mo?a_1q|b@d5xLk~x|$LPGG-U-J2lm>^(C^9rPZNgEaH z07#n#bsvt-uD*7OnbKR`g-bl22Alm5`+$(2$pn4I_)l8WiFhADZKJP#AFl|h?gyX= z&~2yo@e9|&&Xp?Gu!k;~Yef^z5WgySy?yaqB_PCVm*n@bouOB5PXyhruw>q?JBd*_});G*gA2PbR(fMZ@C+Vi${v?XPpu2tHk)s#a2}P>o8rY$4 zGhxzn$9rZhYOrL&zXcZs!90k?pge<=E2%MH^U@Hc3q`Rg1ZO{hCXj)!eM$naZXb+O za1U4GAPNoxoNahBQwC1oD*dyf0=}&qjC2>{B-k_rtbVlOu{auCCVlbFHA1rXv+}is zm-JB~qg9}{!=n_4&-BYGrGC;wdojc@kNp=l&;3)~m{<_#^V`Gj*$T|$HYmwfmRN?Y zQ+R^R`umxr3obEB*siC6DsBmPdlppwSodkAvcUS)UZiGXtT4=LXN0>a)dixPirqY4 zIM}=w+!qv4)ZbsTzlc=bpq_!E#Z0XI&Z+jkV+p+TPtEH(H?BDp7GQ>?CjTi) zT0J#i0S4c%;1`g$w%vd%Z)%RHHAIkO0z*Vd^t9<8?QDbeYe^qL4subJn!E3&x|D}- zWtmL7+Yw_bS2kV!CchIG#k^K73|ut2_Ii~SIv|xHb%|2iZgr7=j(pU5w>z~&xzSe5 zKFkx!(y7mru)5yx%!AJvf$cYnA{?C~paq1WS7WH>?JaRj31S-K4!bewavW`Zhf@u z;opW0ZT=0YtJjD7ycqbew}Wf*!=Gjh)s?va+6lNSIWoGpn?c6nLb2%o>6}o2M?@~* zDy_FyimkMuS|6NYKzfU}$EAjWShxr3c)aD&|LxL{3GOf_z{@=~gw!rbR%{*r+ZVxD zL$jO*ZU29k{J`;+`_}f;B!6aW4#geyehqCf!G2k|P2TS;|J~>X6lSjz&9>V+9*vgl z+MK@a^Iuzt9P|*w6bJeT)Rz9I@dVo18MgZ@_K*wlyW0DF|I%g{dNibMTK_FEJB}!+!tmd)so%yQY!h;GV$%XsWw*Ui7~WV13xFJ|PUKo~cDosVvkE zi*X~hDP&kQ(=2=Nn}IY=NnfxE#f!H;MfqyKgbBX>eslHpS?VW#LPC<6KYt#9{!y;u z^j%+nKZic2P8t3;@7^`h(=)f#*Rvt_`|;yBZ&1*MQ-`e98&5pFDvQJa{HbX~&(PkP zrRB3_x_qDamDTOrLJoC0#?m*Oi-d9L$gFEfFPZ#G>&F`4U@B52*xHL`m(F_Ag!(y3~gr)y;NYNGEanOQyle4~HEi!aadt#~J@&3_s+ zQ1>Jye#pS{4L)bB%Ahy>i~+J*%cUk7KkU0a6ECk_`H$hhv(QGC>0_#~YnSW<%c<-9 zr-+yDa$2k7V~1WaPm(Vjz+|h#`H|TgP;cjBuGA_fR&Jw-RXndZ{h$v(i^BHx6E>$Qw31$2h#iYw1!@Xkx6-^ANI@lgM@o$-}DRq9I$LL{W z6f3!{0`RV}yt^;|q^GCXG(9)zPKK`BJ`XjA_=-1zmb_zFid(!Jxx8PTq_FJ&(x_50 z7dl(TnJ%UKtOc>Cu6XF_MW5uo`(kgpXrT}}jV)k4P&VwB=D)oFB_`=5e3gNRg{8LG z$CaadL;h8@%OAilWkKiTeT+;nJjp4AisQH#KB2Cj*g0M;R^hgqy|dz2RcqW0O7y`4 zPocZi|ETN2MCVw22c6IFMtoIsw02sFQORY|%0c%&N9}-qw>j$7Qdi!tSIW6J?(AtZ zj=O*>2KsiYOn)f=T}MVz5`5tUU2x{O&97J6ygF42*SEyQ$ynbM!%{~bDR^5tgyQp4lyw`dhrC;9 zzgrVEQsC>j)tV_}&okSCH6YiOp z&(=T=uowTwmtHx+d+lP>n1fcPWAGQh`{@q@=5v#Wo~?SEP12AW56&18n)@=H+;c&Z zAssmn_Fox&ZAm(YkiYbKlWNlkq|;oj=|g-KC;B4gb+@^i8O>;#qfOM^O&nuFA}*wy zC%t&_!Xw}(#r;p7JkW-psfN{htNp-aTKlwvc6d0#FrJZ-wOjL7&i|vCB>jpU!NT^CU7k z2_UMo^G$Yj^{Hu2wTi6dJ`MfAqmZ>a#+7}2$l>@Sf}%eyXglv!mu9Ly6)&;40GaS( zWulPy{+z??$|z~d6c;)4vDZnI7iv%awt6o00)$zouxd}QRD-WJs&*H8QF8~#a?5Zd z@O)lXY$xUBDp}wxauyb}EvzhZVQxsp&COGS3=LJF6w>g~q60YAR8m$-o6X5rv4Ynx zhFdKFIER|!c2?$DB4_Zj+vdk|^V;81Ja;)qq*FYHvI`5Jb-QPMziDenRGyVQ_7TBv zyG3!3Ir@82&~j>_5^oV6)Ufpn6W+G(I_9F>S5j?XzPq~{SDg?3Vcnvr#{T_~`+x5S z^L{Mz!7lO57=(!HaE63b<|9{Q!6_PQB!nK3pyv|{`f1}=ehHxeEO*QhO^`)GmdfH! zy1&U)Qa*#jZKm1U*c9BnNf~9^eP17@2?Lij8A!QHe!1T+%ve_(6P)dil`8!jIT7H7 zS{^j>cMvk-Rf}9h(+!QgLVn)|#s{XB)@34EiNP#UpmfH-MkgVnKxQR02|k>1&r9G^ zx7&v+H6^9}p~T=rWMj%rI~>uXzTkXjRC(*hIkh&wrv0lCfZ}?{Ft>zK!>|@F8<>3$ z)VMu|a@Gr^hE;pKc^zVsLmjfP0f9u!76l-XMCso9DU1tFJ1@$^-<|q98tc^Ov!U3x z?nP(oYDlx`fhximWZ-VMqa)>7G2*LHTIvWOO%>FrPn8M^uzCX(M=M#u23gGTZ$E{Q ziYI{c+acZZm7s3r2eISU0MC!k8T{=J0^p4-`K9>uNkJENZM9LdPdz>2j_A%+2!9P! zTVU&ya_DG%-u9e8Y~3%Sydnlu-KZ%1}6`%_K5rp;^V97 zRQa#a00r~YS4P&(P(s-%qB_ZUI+543m)ULIwjdm%twh_@%M?p(XH@>YxJKaGP zR9QaWtt5>Mk>woGQd2<-M(jj+3TVl2ub_%BRUNT3_Ojh~ebpUc0W6mzr(Cc_v4S$j ziQII2>Ds^#!}!%iPI(Bypjd#C?iwfPGG3ED+bt4wXY@z3Kv~%2K@omMER7a)1eE+X zgY{2At9!+6C<+St1-)V+2)08GK&4kqdfP3oDOArzyJLf{i1K8hW5a62O)No_7bNeP zk*<#NE%l4Us3|AY4Oscr*rC<35{_+gR z;9=opjrg2qVfFoWrw39S*Yt1LWp(D5l*;}BehDx3f+S6H>_l>gbM~2^u#px=_BolP zZz=oSE^g?Oy3*Q&k#*nv{wQhCLL}WKk9GFutr?%_{7s{K4&9IY-l*mNj&Ah{!YXdvk8x$ zX{f>E%Qc3lb?Tlik3ZV;G(TFXO@z(R(GwfEyU`E{C}4PC2zmiK8}G}_ZYmfWEWJhf zSty!d3!tG3x;Dz$AiO>~x-vx$Q?5b@CkAF9(*fLf#-NRD{8Fc|fi*HgH#Cknx0nqr6D{ z<(g#1IiymeVCX7*rL0t}dh-e#IpsTOEZf5vdm7tz&Cg=_c<2w|O#&mQ`Lpyzpfd`3 zN3Ha(Jl=kp?+CpQHYQ;McQ$qz?fw#@J%0=dO1h8=1D%AAC_v1U%u@8%5ez(@0Z6Hk zYq&i9%ym~!0)v3eM%rw~Fec;T0>)Ed^uCJ{WdkdtGt(V3>LM6k$g2wf5A3)vjScQH z6q@qIf=|E2`6eRhsvK=ejJh6YVVGI^}rC?w#56d@2g6=Z-a;`s=9l*Fa;f*Fp*g(xjF`&60 zVfMJK&?WU7OSUA%Y$BjwplWBM8-h2U5W^0{F$_9~PTVx|` zI-adWy4}H-maE9#Gt)(vr;p(g&@H{PB42r;9dYv-^HNuNxO3Vdp1f2E%kZJd_uGDA zGRP>=bRx8@==E5bEVfj>(H!w@=IcaWC{F)Iq)NlqY~Q^LR|c53u+O}24@e8auHHG@ zK?4>r*we*rE@(^k)V>>6Kb3W9nQVikB+mL9At`6OLPY%Ag0K^8IoDS4pt@Qutn)h3 zCTwjoV_9zg87pX+cqyd)h8!Nd@8|OPAd2PD$s;Q|yKNt-byT^m=psB`&;&aWA7{W> z_PfNt#G}d4<7gMOZ@9<@xAJ{KK1Z|En)!k31oGmu=ES{AOU*o66J!)t$S+X4H@G4N zrOPvSrtnE*k>X>Qg6g(-x;Eus%jiGpv*Lm=Op{Lte{%atL8URnn)WeTV*vf( z7eLQjPBFv2*(V_IKqEa7r+q3hMt{IGY4+W?;zM@OhMRr@SDhv)1Ys4sG^HbMjQN`rx{4pSOlIeVfp})?gS9aM4&%^o?K%!TW0Nv(~(`1dB>Bo-i9yC95`4 zBc|l%AJA>id+C?s z3&seZn$amFy_n+_dFo4G98m3o;3lJ&RT|A&NCt5i2m^~Cs3l+w`;C?0!7iA3|8F8s zNkZp_h?=_>ND?u1u?#-w5T~F(==p>9eQ_cu(wf$u68E>Mv<1^SE1ysA zQq1rG&;f`&iKxod@(hr-Hs$en8+xu#SZB>bPATPBy7H#MdKu1>(Rh=IWSC;oBUdOK z0_`m*r1|xpJyXLG0c4+1CN|I(s=ozoss;|*opeBuh-Ns5NjPYg7R433&u)SNq9rJ<10sW`)Wpnuw)#GmNucS zz8Vzt36M2yP1}3Q2hI3{7&KGo1-i>Y8-eyI_6mNndZ-w+8r3PSMpkE9Gc#(<^E3hF zl9*@3Fq&K=;P2u^^yn3uR6laq5y2n#xI$YmLNL*d_;k9US$xji|3Kr2|K>IICi70% zWEHAVq*XW-$;d4QLopEnL>VU$LKFyx(4!$3t)9&YU-1_h%vsk@Axx^r3Ls(*eF6^5 zpUEx*@v(Np_|el6e=#z-jR0i!UHe<;BptVlGuD1nLO*7K8yZe26$oJcb=syS%h z20*EenfdzkH}n{pzK78`G_e3x#Jz$CRKd&a6$b^1_!nI4IpZVZw)4pmn^L>JH*fX4 ztUl+yO?-b}wX4q3*u>t86?Hp2%zmQNi8wRg^h0K*QN9lwE*zxwJ-jsD+9E04op|BB zdY$gfiDcUNsm3Uw6~7JqEJF_^t|(xX7gBLAVt8W2&aA+%2*xFTymq>aE^+$Ryp$`w zEVtS=;Qi|mH&3rCx{y8n@++=Rage?K%*z3$$S(>N{90D`Lk*pW&L)U7i9tv{NIa0$ zcCN-5PKT)vhwVaVROgagDo5fJiU#A%@XgN~J#p+hSVy7(iFdt=Jee0%?7)USbWa)A z!72q!r-LUW+>@mB9l4n^dal~T`%y0k*JoAH^(&Qw8?Svsugs-=E_y(1JujK+M(iOC z{n-0$gSeU$;&Y10Z7MO`IK=B|IL+kRxYI7?PR|aGDi|bZrSRsE9gYgWu1)Y{-TU>{ z8b`r2nCM-K?7cC4AswcNFKTLEOPg)=*)zb>XaB+p5S`&R&zId%`+4#=Mg@?e5mR`s zWu$u!S==D*OeuKWL2>iT+2ikZg?GJ8Z?^fdaKjTUrS4zZpi6q60lat@QUQ|REv58O zO1k@PNrY#EQb-3ilw&;}cz&W6sbCFM=qZHD+Lr5UA4s;>C%ZRJ8j7>%apG_ze_F7c zpMz1jp2r@;@bLU9&h-9+#T2`2oxMa=vqbH#j})gRa?esdO`voJG1fu&))cZXX-2Om zEd}mFf_A8L1QwSR@_c4*wPxuVs}Corr**=Zfc97G86iOsSSr6#V;GI_40FQx_RtntGH#~k?N?w7ba<&$LOSZ z0Sl(UK`F^kxZHX2Ll|qY2))SpYm9Uj26+QeHw%}S#o6Y zP5Lpx`hsoc6xoN9S~2}ghkQlsNnImlZTMCYmMo_%Nw8Q$7$~rz$+3(M3+WE$)OU$vmA678i>!f}r#V~=PM-7TP6*Ds>!nSd)aRr%< zn0o6zz@)d@s8L+KDjV+GPjez|BeQbki(I*Dl4QeeYdthV#o0JF_DHv116g}rj#^O3 zWJOaC+ArYU0APmq$=QqhzWp2zw$+BKs=1&lWw97n@*r=HuQG`8I%G_09Ya7c#sWnB zOH9!@oZH5sbHP17oH@7Or_y-?D?{1pw6O_ZTqQ;frxP}W!y1l`zl=^i7|6JubQkb) zpKiH4P|*VYJQ*X;@zLt*Gb$dpCk-1EG}m>&G53wT#$!PVUg!Mc<*{K0d+Wbm-yE zHj}@LWks`N`;Ye;a<_HYc^=NDMJKMD6BNg)pCFwhDcCRi^=q*o5OlnQABJWnX&Ztm zH6?pjC&rm}Jl)|4S_5EQYEN%R4U5KyOp{O##>jEg6pG(cnVGaf4MSZB;q}so9q%}a z{}3AbP-X1W6>-g&F^n^wyXiP5knqvE(#{t;mpVA3uwBDk5}0}p+~U&k%yXgnskD|h zLK;}Q%KQ-Gy1!H?Rm|-HwmbX%`F-j)r>7WCncTi7ErZ&JhVRgm#BlJRwkRWZ*s%lcZn`?WN;g3ea!``)Lzbj)l;7|+|k#iclF+cOxHqixi$ zO=_yguXN3L!tFe0tE%`cV{`GjsvdoxS#TUp*CW_F7`%^E)CU#Rx%Mz)_PyP*DI9#F z*Oi()QXfrs=0z^Y#*E!|fVc5Oh;WcM5vk>Cw7vh)dhLO-B$Y(2BfcNzshjmte>7}( zCUJWZX9~Z)yXc&BwTf_-$pGw0T8XfW!_nE_&h;O)^QDepaJfe+$QxXXLX$Kfoc3FK zG|N`Gzp`hz{7t0gPm2e8DSIiCPg-1b4)q!Z$^EG|Q zTy}PBd@EqEM7~US-DxY~L0!G}*DwYtYvf)1Pyp*??K-D^pWuhS*&D^3e}4Uy)?T9X zQTyBB57$xH{W-J|@UQ2}XQs0BYey2hqPA}9^>{@RGJQ(>u;Wp$^}EGod#UfpVCKW+ zAkH|NHe2&xF|qTPQE;xbk4L5I!Na8$b^wK1K{FpMM3aE0EvOq@|H$eA?Fig21uZq^ zixbKhDB0duVBT(kmP#iPN>RJDFO4*zuZ5*C3^XP!=0+>ru|}z}vh42)do9TS+K@ zXhi~lFbbUNz&IZ@yr&YT{XRQMw{k`UMs}v0^*Y7`^RJnEoC6Tx*JIyX;_PH9ZIGxI zz^|0>p56vCcX@j)5M|)SM%MECZGa)TV*7$Rwc)mHZGdfP5OO#bxTv+(xApc&5-IciWfT@^1#4b` zrLcNt-5Tyu(P-l8lFp>p7XIzaORnb*6idrUwcUH5P+j;QR9I%2e$bug2DH`?*x)?k z+Dq;g&I%*O?tgeiS{i2+c9;&w6#5ih_(*)vuauctW>0@2<0J_(CYQ6`G690LzN2F{ym)X&ufjo^?ct3=hu&hi54r8w{%<$Q zwuI{QZdiEFCF^_covm41tGqB!L8t5Ut0FpI3ztybUUMJL9c+EReu)Lnq0Hz%;(M{- zVL=!5JNwo{WcdenABaR&RKog8nx&7f#+5ww74MIFq@$@e@_kZlP4o?`qJD(?2nE=8 zg>1=f)yxHZfqk>0bba5;A9mE*b<5JzjUtBbosc3qVy1(JxQb`L8=@vhOoP{I-ZBE! zozk|CEQLpsyux`OoXG{u%FtZ~=Wy-5;L}5G>i>Rl{?B)de{2-~=EGAE4UEA&v2umlGdDZ3f`-18WRxS#hz;d zPSvyFr#qo(qDeV8C{#?^-)m@aliqmj2Z|*uZ?)$De(}gdNrYxBm \ No newline at end of file + + +Программное обеспечение узла и инструментов сети — **COOPOS**. Ресурсы (**powerup**), регистрация аккаунтов и контракты описаны в разделе **cleos**: [Ресурсы сети, регистрация и контракты](system-resources.md). Установка, **nodeos**, **cleos**, **keosd** и полная справка по командам: [Программы узла и справка](coopos/index.md). \ No newline at end of file diff --git a/docs/documentation/blockchain/nodes.md b/docs/documentation/blockchain/nodes.md index 0a968368e..664288542 100644 --- a/docs/documentation/blockchain/nodes.md +++ b/docs/documentation/blockchain/nodes.md @@ -1,11 +1,11 @@ -Все транзакции, которые отправляются в блокчейн - принимаются нодами. Полная копия всей цепочки содержится на каждой ноде и передаётся другим нодам по внутренним протоколам связи с регулярностью дважды в секунду (2 блока в секунду). +Все транзакции, которые отправляются в блокчейн — принимаются нодами. На **полных** PEER-нодах хранится **полная** копия цепочки блоков; она передаётся другим нодам по внутренним протоколам с регулярностью дважды в секунду (2 блока в секунду). **Light-ноды** намеренно **не** держат архив всей цепи: они стартуют **со снимка** и синхронизируют только **новые** блоки (см. раздел [LIGHT-нода](#light-нода) ниже). !!!note "Нода - экземпляр серверного программного обеспечения блокчейна" На нодах исполняется программное обеспечение блокчейна. Ноду блокчейна может запустить и синхронизировать из открытых источников любой желающий на своём сервере. -История транзакций образует публичную последовательность вызова действий всех смарт-контрактов от момента запуска платформы. И эта содержится одновременно на всех нодах сети и она абсолютно идентичная. +История транзакций образует публичную последовательность вызова действий всех смарт-контрактов от момента запуска платформы. На **полных** нодах она **идентична**; у **light-нод** локально доступны только **фрагмент** цепи после снимка и **текущее согласованное состояние** для работы приложений. -Однако, то, как ноды работают с этой историей, зависит от их назначения. Всего в сети можно выделить 4 основных функциональных назначения нод: HISTORY-ноды, DELEGATE-ноды, SEED-ноды и API-ноды. +Однако, то, как ноды работают с этой историей, зависит от их назначения. На прикладном уровне обычно выделяют **HISTORY-ноды** (в конфигурации COOPOS это часто отдельный профиль **state-ноды** с `state_history_plugin`), **DELEGATE-ноды**, **SEED-ноды** и **API-ноды**. Отдельно в эксплуатации кооперативов повсеместно используются **light-ноды**: они поднимаются **со снимка состояния**, **не хранят полную историю** с генезиса, но **мгновенно готовы к работе** и обычно включают **локальный API** и **P2P** для синхронизации новых блоков **между контурами кооперативов**. Примеры `config.ini` для state- и light-профилей см. в разделе [Конфигурация](configuration/index.md). Все эти ноды по своей сути являются PEER-нодами, т.е. нодами, которые равны друг другу. @@ -54,7 +54,7 @@ flowchart TD ## HISTORY-нода Несмотря на то, что все PEER-ноды обычно содержат полную цепочку истории событий, это не предоставляет им прямой возможности обращения к ней. История содержится на всех PEER-нодах, воспроизводится при запуске, и синхронизируется, но в этом процессе используются только данные из текущего блока. После проверки блока - данные уходят в историю, сохраняются на жестком диске в цепочке истории, и активно в PEER-ноде не используются. -Чтобы их использовать активно, каждый желающий может запустить HISTORY-ноду, включив дополнительный плагин, который сделает все исторические данные доступными по протоколу Websocket. В сети существуют программные решения (в том числе в наших репозиториях), которые используют HISTORY-ноды для извлечения данных из цепочки истории ноды - в обычную базу данных MONGO или POSTGRES. +Чтобы их использовать активно, каждый желающий может запустить HISTORY-ноду, включив дополнительный плагин, который сделает исторические данные доступными по протоколу **State History (SHiP)** поверх WebSocket (см. [State History (SHiP)](state-history-ship.md)). Для подписки на этот поток и десериализации в прикладные потоки в экосистеме COOPOS поставляется **[Реактивный чтец SHiP](../reactive-ship-reader.md)**; классические пайплайны также выгружают данные в **MongoDB** или **PostgreSQL**. **State-ноду** при желании **совмещают с API-нодой** на одном хосте или выносят отдельно — см. [state-нода](configuration/state-node.md). ```mermaid flowchart TD @@ -151,6 +151,17 @@ API-ноды при получении новой транзакции неме Но API-нода не беспокоится об этом. Её задачи - первичная валидация, вещание транзакции в сеть, а также, извлечение информации из собственной базы данных по запросам. База данных API-ноды формируется в процессе синхронизации и обновляется дважды в секунду автоматизированным и заверенным решением делегатов. +На **light-нодах** тот же **Chain API** используется для **локальной** работы приложений кооператива: состояние соответствует цепи **с момента снимка** и далее по новым блокам, без полного архива прошлого. Профиль см. [light-нода](configuration/light-node.md). + + +## LIGHT-нода + +**Light-нода** — экземпляр `nodeos`, запущенный **со снимком (snapshot)**: не воспроизводится вся цепь с первого блока, узел получает **готовое состояние** и дальше **догоняет сеть по P2P**. Такой режим даёт **быстрый старт** и меньшие требования к диску под полный журнал блоков. + +В системе **кооперативов** типовая схема — **light-ноды на каждом контуре**: внутри контура работает **API** для сервисов, а **P2P** связывает узлы **между кооперативами** (и при необходимости с публичными seed-нодами сети). Глубокая **история** и индексация при этом опираются на выделенные **state-ноды** и клиентов вроде [Реактивного чтеца SHiP](../reactive-ship-reader.md), а не на полный локальный лог на каждой light-ноде. + +Подробнее: [Конфигурация: light-нода](configuration/light-node.md). + ## SEED-нода Для того, чтобы все ноды сети могли получить информацию о её состоянии - необходимы специальные ноды, которые будут предоставлять эту информацию большими пачками блоков транзакций. Такие ноды называются SEED, или, семя. @@ -188,7 +199,7 @@ flowchart TD Синхронизация - процесс скачивания и криптографической проверки истории транзакций блокчейна. -При подключении новой PEER-ноды к платформе, она скачивает всю историю, криптографически проверяет взаимосвязь между блоками, и полностью воссоздаёт состояние своей базы данных таким, какое оно у всех других нод в сети. +При подключении новой **полной** PEER-ноды к платформе она скачивает **всю** историю, криптографически проверяет взаимосвязь между блоками и полностью воссоздаёт состояние своей базы данных таким, какое оно у остальных нод сети. **Light-нода** вместо этого загружает **снимок состояния** и затем синхронизирует **только новые** блоки по P2P — прошлое не восстанавливается локально, зато узел **готов к работе сразу** после применения снимка и подключения к пирам. Синхронизация выполняется между всеми PEER-нодами дважды в секунду. Именно такая скорость производства новых блоков истории транзакций на платформе. Блоки могут быть и пустыми, но процесс производства и синхронизации не останавливается ни на секунду. diff --git a/docs/documentation/blockchain/sostav.md b/docs/documentation/blockchain/sostav.md index 884017c03..d89f635fd 100644 --- a/docs/documentation/blockchain/sostav.md +++ b/docs/documentation/blockchain/sostav.md @@ -1,6 +1,6 @@ # Состав -Операционная система кооперативной экономики основана на открытом коде блокчейнов EOSIO и Antelope. Она предоставляет ряд компонентов и библиотек, которые используются для управления узлами распределенного реестра, сбора данных, взаимодействия с этими узлами и разработки смарт-контрактов. +Операционная система кооперативной экономики опирается на стек **COOPOS**: компоненты и библиотеки для управления узлами распределённого реестра, сбора данных, взаимодействия с сетью и разработки смарт-контрактов. [:octicons-arrow-right-24: Репозиторий nodeos, cleos и keosd](https://github.com/coopenomics/blockchain) diff --git a/docs/documentation/blockchain/state-history-ship.md b/docs/documentation/blockchain/state-history-ship.md new file mode 100644 index 000000000..ad1f96868 --- /dev/null +++ b/docs/documentation/blockchain/state-history-ship.md @@ -0,0 +1,77 @@ +# State History (SHiP) + +**State History (SHiP)** — плагин `state_history` в узле COOPOS. Он нужен, чтобы **индексаторы и сервисы** получали **историю цепи потоком**: блоки, при необходимости **трассировки транзакций** и **изменения таблиц состояния** (дельты), а не только точечные ответы по HTTP. + +**Зачем отдельный механизм.** Обычный **Chain API** удобен для текущего состояния и разовых запросов. **Trace API** отдаёт данные из **файлов** трасс на диске. **SHiP** даёт **подписку и догон синхронизации** по одному каналу с контролем нагрузки на узел — это типичный способ строить проводники, аналитику и кошельки, которым нужна полная история. + +**Важно:** это **не REST и не OpenAPI**. Транспорт — **WebSocket** (или Unix-socket с тем же протоколом), сообщения после рукопожатия — **бинарные**. Для интеграции используйте **готовые реализации протокола SHiP** под COOPOS: укажите адрес вашего `state-history-endpoint` и при необходимости сверьте `chain_id` из статуса узла. + +В комплекте экосистемы COOPOS для подписки на поток SHiP в Node.js-приложениях используется **[Реактивный чтец SHiP](../reactive-ship-reader.md)** ([coopos-ship-reader](https://github.com/coopenomics/coopos-ship-reader) на GitHub). + +--- + +## Устройство на узле + +Узел при применении блока пишет в **журналы** state history (трассы и/или дельты состояния — в зависимости от настроек) и может **уведомлять** уже подключённых клиентов о новой голове цепи. Клиент по WebSocket запрашивает диапазон блоков и получает поток результатов. + +```mermaid +sequenceDiagram + participant Chain as Цепь (контроллер) + participant SHiP as state_history_plugin + participant Logs as Журналы SHiP + participant Client as Клиент (готовая SHiP-библиотека) + + Chain->>SHiP: блок принят + SHiP->>Logs: запись трасс / дельт + SHiP->>Client: при необходимости — обновление (новый head) + Client->>SHiP: запрос блоков / статуса + SHiP->>Client: поток данных по протоколу SHiP +``` + +Детали сериализации и очередей сообщений реализованы в узле; **писать свой парсер с нуля не обязательно** — опирайтесь на существующие SHiP-клиенты, в т.ч. на [Реактивный чтец SHiP](../reactive-ship-reader.md). + +--- + +## Что включить на узле + +Основные опции (в `config.ini` или аргументах командной строки): + +| Опция | Зачем | +|--------|--------| +| `trace-history = true` | Писать журнал **трассировок** транзакций. | +| `chain-state-history = true` | Писать журнал **дельт состояния** таблиц. С этим режимом на узле действуют ограничения на replay (целостность журнала). | +| `state-history-endpoint` | Адрес и порт для **входящих** WebSocket-подключений (по умолчанию в коде часто `127.0.0.1:8080`). **Не открывайте в интернет без защиты** — это полный поток истории. | +| `state-history-unix-socket-path` | Вместо TCP — **Unix socket** (удобно локально). | +| `state-history-dir` | Каталог данных SHiP (часто `state-history` рядом с data-dir). | + +Дополнительно узел может **урезать или нарезать** журналы по блокам (`state-history-log-retain-blocks`, stride/archive и т.д.) — если узел не «архивный», это помогает не забить диск. В логах при старте обычно видно **с какого блока** доступна история — индексатор начинает синхронизацию оттуда. + +--- + +## Краткий поток + +- После подключения по WebSocket сервер первым делом шлёт **текстовый ABI** — по нему клиенты понимают бинарные типы. +- Дальше обмен **бинарными** сообщениями: запрос статуса узла, запрос диапазона блоков с флагами «что отдавать» (блок / трассы / дельты), при необходимости **подтверждения приёма**, чтобы узел не перегрузил клиента. +- Поведение при **смене ветки** (fork) учитывается протоколом — готовые клиенты это обрабатывают. + +Низкоуровневые таблицы полей и порядок фреймов описаны в коде COOPOS (`libraries/state_history/.../types.hpp`, плагин `state_history_plugin`); для повседневной работы достаточно **готового SHiP-клиента**. + +--- + +## Эксплуатация + +- Журналы могут занимать **много места** — продумайте retain/partition или отдельный архивный узел. +- Первый прогон с `chain-state-history` может долго **инициализировать** состояние в журнале — это ожидаемо. +- Доступ к endpoint — только **доверенной** сети (VPN, firewall, Unix socket). + +--- + +## Где это в документации API + +| Механизм | Как ходить | Роль | +|----------|------------|------| +| Chain API | HTTP, JSON | Состояние, таблицы, push транзакций. | +| Trace API | HTTP, JSON | Чтение файлов трасс на диске. | +| **State History (SHiP)** | **WebSocket, бинарный протокол** | **Потоковая** история блоков, трасс и дельт для индексаторов. | + +Исходники плагина и тесты сценария подключения: `coopos/plugins/state_history_plugin/` (в т.ч. `state_history_plugin.cpp`, каталог `tests/`). diff --git a/docs/documentation/blockchain/system-resources.md b/docs/documentation/blockchain/system-resources.md new file mode 100644 index 000000000..789b494cd --- /dev/null +++ b/docs/documentation/blockchain/system-resources.md @@ -0,0 +1,26 @@ +# Ресурсы сети, регистрация аккаунтов и контракты + +Здесь описано поведение сети на уровне системного контракта **`eosio.system`**: как выдаются **NET**, **CPU** и **RAM**, как создаются аккаунты и кто может обновлять код контрактов. Это справочный текст для операторов и разработчиков, без привязки к исходному коду репозитория контрактов. + +## Ресурсы: `powerup` + +Полоса сети (NET), процессорное время (CPU) и квота **RAM** выдаются через действие **`powerup`**: это **временная аренда** на фиксированное число дней, которое задаётся параметром сети (`powerup_days`). + +- Указываются плательщик и получатель ресурсов; оплата — в основном токене сети. +- Сумма распределяется между рынками NET, CPU и RAM (условно четверть, четверть и половина платежа). +- При обычной аренде фиксируется срок; по его окончании ресурсы возвращаются в общий пул. Очередь истекших аренд обрабатывается в том числе действием **`powerupexec`** (его может вызвать любой аккаунт в пределах лимита за одну транзакцию). +- Если квота RAM оказывается ниже уже используемого объёма, контракт ведёт учёт «долга» по RAM; чтобы его погасить, нужна достаточная сумма в рамках очередного **`powerup`**, иначе транзакция будет отклонена. + +Практические примеры вызова через **`cleos push action`**: [Ресурсы и powerup — примеры cleos](coopos/resources-powerup-ru.md). + +## Создание аккаунтов + +Новые аккаунты в продуктовом контуре создаются через сценарий с участием аккаунта **регистратора** и действия **`createaccnt`**: с кооператива списывается регистрационный взнос, затем от имени системного аккаунта выполняется **`newaccount`**. При включённом рынке **`powerup`** новому аккаунту выдаются стартовые ресурсы через **`powerup`** в режиме передачи (`transfer`), чтобы обеспечить работоспособность аккаунта. + +Протокольное действие **`newaccount`** в сети принимается при авторизации **регистратора** или самого **`eosio.system`**, а не от произвольного «создателя» с кошелька разработчика. + +## Обновление кода контрактов (WASM) + +Обновление программного кода на аккаунте проходит с учётом правил системного контракта: менять WASM могут **только аккаунты, включённые в белый список** контрактов. Остальные попытки **`set contract`** / смены кода на цепи будут отклонены. + +Инструмент **`cleos`** по-прежнему используется для сборки и отправки транзакций; ограничения задаёт сеть, а не только интерфейс CLI. diff --git a/docs/documentation/blockchain/transactions.md b/docs/documentation/blockchain/transactions.md index 9fd21b342..b720fb7a5 100644 --- a/docs/documentation/blockchain/transactions.md +++ b/docs/documentation/blockchain/transactions.md @@ -1,6 +1,6 @@ ## Действия -Для изменения состояния блокчейна в EOSIO используются действия. Действие — это атомарная операция, выполняемая в контексте определённого аккаунта и смарт-контракта. Она представляет минимальную единицу изменения состояния блокчейна. Все действия передаются и исполняются строго в порядке их указания в транзакции. +Для изменения состояния блокчейна COOPOS используются действия. Действие — это атомарная операция, выполняемая в контексте определённого аккаунта и смарт-контракта. Она представляет минимальную единицу изменения состояния блокчейна. Все действия передаются и исполняются строго в порядке их указания в транзакции. !!!note "Действие - это атомарная операция по изменению состояния блокчейна" diff --git a/docs/documentation/index.md b/docs/documentation/index.md index 52361829a..9d12e8035 100644 --- a/docs/documentation/index.md +++ b/docs/documentation/index.md @@ -1,6 +1,6 @@ # Введение -Операционная система кооперативной экономики основана на открытом коде блокчейнов EOSIO и Antelope. Она предоставляет ряд компонентов и библиотек, которые используются для управления узлами распределенного реестра, сбора данных, взаимодействия с этими узлами и разработки смарт-контрактов. +Операционная система кооперативной экономики опирается на стек **COOPOS** — узлы, инструменты и библиотеки для распределённого реестра, сбора данных, взаимодействия с сетью и разработки смарт-контрактов.