From fbb630451dd0a8cc4b628930140f9b9c7e134bfa Mon Sep 17 00:00:00 2001 From: Luis Paris Date: Thu, 6 Feb 2020 10:11:40 -0500 Subject: [PATCH 01/22] update block schema descriptions in consensus protocol --- docs/04_protocol/01_consensus_protocol.md | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/04_protocol/01_consensus_protocol.md b/docs/04_protocol/01_consensus_protocol.md index 53bf5be2..5251394f 100644 --- a/docs/04_protocol/01_consensus_protocol.md +++ b/docs/04_protocol/01_consensus_protocol.md @@ -150,19 +150,19 @@ Name | Type | Description -|-|- `timestamp` | `block_timestamp_type` | block creation time (before any transactions are included) `producer` | `name` | account name for producer of this block -`confirmed` | `uint16_t` | non-zero if block confirmed by producer of this block -`previous` | `block_id_type` | block ID of the previous block -`transaction_mroot` | `checksum256_type` | merkle tree root hash of transaction receipts -`action_mroot` | `checksum256_type` | merkle tree root hash of action receipts -`schedule_version` | `uint32_t` | increments when new producer schedule is confirmed for next schedule round (must be `0`; field moved to `new_producers`) -`new_producers` | `producer_schedule_type` | holds schedule version, producer names and keys for new producer schedule (included in first block of schedule round) -`header_extensions` | `extensions_type` | extends header fields to support additional features -`producer_signature` | `signature_type` | digital signature from producer that created and signed block +`confirmed` | `uint16_t` | number of prior blocks confirmed by the producer of this block in current producer schedule +`previous` | `block_id_type` | block ID for previous block +`transaction_mroot` | `checksum256_type` | merkle tree root hash of transaction receipts included in block +`action_mroot` | `checksum256_type` | merkle tree root hash of action receipts included in block +`schedule_version` | `uint32_t` | number of times producer schedule has changed since genesis +`new_producers` | `producer_schedule_type` | holds producer names and keys for new proposed producer schedule; null if no change +`header_extensions` | `extensions_type` | extends block fields to support additional features (included in block ID calculation) +`producer_signature` | `signature_type` | digital signature by producer that created and signed block `transactions` | array of `transaction_receipt` | list of valid transaction receipts included in block -`block_extensions` | `extension_type` | extends header fields to support additional features -`id` | `uint64_t` | UUID of this block ID (a function of block header and block number); can be used to query a transaction within the block -`block_num` | `uint32_t` | block number (sequential counter value since genesis block 0) -`ref_block_prefix` | `uint32_t` | lower 32 bits of `id`; used to prevent replay attacks +`block_extensions` | `extension_type` | extends block fields to support additional features (NOT included in block ID calculation) +`id` | `uint64_t` | UUID of this block ID (a function of block header and block number); can be used to query block for validation/retrieval purposes +`block_num` | `uint32_t` | block number (sequential counter value since genesis block 0); can be used to query block for validation/retrieval purposes +`ref_block_prefix` | `uint32_t` | lower 32 bits of block ID; used to prevent replay attacks Some of the block fields are known in advance when the block is created, so they are added during block initialization. Others are computed and added during block finalization, such as the merkle root hashes for transactions and actions, the block number and block ID, the signature of the producer that created and signed the block, etc. (see [Network Peer Protocol: 3.1. Block ID](03_network_peer_protocol.md#31-block-id)) From 2973b8678852de4f3fdb5359d449148933fbebdc Mon Sep 17 00:00:00 2001 From: Aaron Fu <51936236+b1aafulei@users.noreply.github.com> Date: Fri, 7 Feb 2020 15:41:25 +0800 Subject: [PATCH 02/22] Add a troubleshooting note for starting keosd --- .../02_development-environment/06_start-your-node-setup.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md b/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md index 289ad1a3..8c40a401 100755 --- a/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md +++ b/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md @@ -54,6 +54,8 @@ These settings accomplish the following: ### Troubleshooting +After entering `keosd &`, if you encounter a message saying "3120000 wallet_exception: Wallet exception Failed to lock access to wallet directory; is another keosd running?", you may have already had `keosd` processes running in the background. Try killing them by, for example, `pkill keosd`. + If in the previous step, after starting `nodeos`, you see an error message similar to "Database dirty flag set (likely due to unclean shutdown): replay required" try to start `nodeos` with `--replay-blockchain`. More details on troubleshooting `nodeos` can be found [here](https://developers.eos.io/manuals/eos/latest/nodeos/troubleshooting/index). ## Step 2: Check the installation From a7291a4d1797721d08ddb05c1cd19b90488008ea Mon Sep 17 00:00:00 2001 From: Luis Paris Date: Fri, 7 Feb 2020 16:59:27 -0500 Subject: [PATCH 03/22] add missing image --- docs/04_protocol/images/p2p-node-peer-sync.png | Bin 0 -> 57154 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/04_protocol/images/p2p-node-peer-sync.png diff --git a/docs/04_protocol/images/p2p-node-peer-sync.png b/docs/04_protocol/images/p2p-node-peer-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..85c5933e163d02e92974cc457b49ada5b225c358 GIT binary patch literal 57154 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�)`(GD6 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 literal 0 HcmV?d00001 From 5af03e684a4b29bf794c3ec540ebd873645f9bcc Mon Sep 17 00:00:00 2001 From: Luis Paris Date: Fri, 7 Feb 2020 17:07:40 -0500 Subject: [PATCH 04/22] update block_num field description --- docs/04_protocol/03_network_peer_protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/04_protocol/03_network_peer_protocol.md b/docs/04_protocol/03_network_peer_protocol.md index d294c4db..31c357ef 100644 --- a/docs/04_protocol/03_network_peer_protocol.md +++ b/docs/04_protocol/03_network_peer_protocol.md @@ -272,7 +272,7 @@ The block state identifies a block and the peer it came from. It is transient in Block State Fields | Description -|- `id` | 256-bit block identifier. A function of the block contents and the block number. -`block_num` | 32-bit unsigned counter that locates the block sequentially in the blockchain. +`block_num` | 32-bit unsigned counter value that identifies the block sequentially since genesis. `connection_id` | 32-bit unsigned integer that identifies the connected peer the block came from. `have_block` | boolean value indicating whether the actual block has been received by the node. From ba23c6d793ba7520a44ffd4858b75db192afb725 Mon Sep 17 00:00:00 2001 From: Luis Paris Date: Fri, 7 Feb 2020 18:05:09 -0500 Subject: [PATCH 05/22] minor edits to p2p protocol --- docs/04_protocol/03_network_peer_protocol.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/04_protocol/03_network_peer_protocol.md b/docs/04_protocol/03_network_peer_protocol.md index 31c357ef..903f9797 100644 --- a/docs/04_protocol/03_network_peer_protocol.md +++ b/docs/04_protocol/03_network_peer_protocol.md @@ -5,7 +5,7 @@ content_title: Network Peer Protocol # 1. Overview -Nodes on an active EOSIO blockchain must be able to communicate with each other for relaying transactions, pushing blocks, and syncing state between peers. The peer to peer (p2p) protocol, part of the `nodeos` service that runs on every node, serves this purpose. The ability to sync state is crucial for each block to eventually reach finality within the global state of the blockchain and allow each node to advance the last irreversible block (LIB). In this regard, the fundamental goal of the p2p protocol is to sync blocks and propagate transactions between nodes to reach consensus and advance the blockchain state. +Nodes on an active EOSIO blockchain must be able to communicate with each other for relaying transactions, pushing blocks, and syncing state between peers. The peer-to-peer (p2p) protocol, part of the `nodeos` service that runs on every node, serves this purpose. The ability to sync state is crucial for each block to eventually reach finality within the global state of the blockchain and allow each node to advance the last irreversible block (LIB). In this regard, the fundamental goal of the p2p protocol is to sync blocks and propagate transactions between nodes to reach consensus and advance the blockchain state. ## 1.1. Goals @@ -111,7 +111,7 @@ At the highest level sits the Net Plugin, which exchanges messages between the n ## 2.1. Local Chain -The local chain is the node’s local copy of the blockchain. It consists of both the irreversible and reversible blocks received by the node, each block being cryptographically linked to the previous one. The list of irreversible blocks contains the actual copy of the immutable blockchain. The list of reversible blocks is typically shorter in length and it is managed by the Fork Database as the Chain Controller pushes blocks to it. The local chain is depicted below. +The local chain is the node’s local copy of the blockchain. It consists of both irreversible and reversible blocks received by the node, each block being cryptographically linked to the previous one. The list of irreversible blocks contains the actual copy of the immutable blockchain. The list of reversible blocks is typically shorter in length and it is managed by the Fork Database as the Chain Controller pushes blocks to it. The local chain is depicted below. ```dot-svg @@ -512,7 +512,7 @@ To make effective use of bandwidth, the required blocks are obtained from variou ![](images/p2p-node-peer-sync.png "Node-peer syncing") -When both LIB and head blocks are caught up with respect to the peer, the operation mode in the Sync Manager is switched from catch-up to in-sync. +When both LIB and head blocks are caught up with respect to the peer, the operation mode in the Sync Manager is switched from catch-up mode to in-sync mode. ## 3.4. Mode Switching @@ -527,7 +527,7 @@ In the first case, the node switches the mode from in-sync to head catchup mode. # 4. Protocol Algorithm -The p2p protocol algorithm runs on every node, forwarding validated transactions and validated blocks (starting EOSIO v2.x, a node will also forward block IDs of unvalidated blocks it has received). In general, the simplified process is as follows: +The p2p protocol algorithm runs on every node, forwarding validated transactions and validated blocks. Starting EOSIO v2.0, a node also forwards block IDs of unvalidated blocks it has received. In general, the simplified process is as follows: 1. A node requests data or sends a control message to a peer. 2. If the request can be fulfilled, the peer executes the request; repeat 1. @@ -734,4 +734,4 @@ Protocol messages are placed in a buffer queue and sent to the appropriate conne # 5. Protocol Improvements -Any software updates to the p2p protocol must also scale progressively and consistently across all nodes. This translates into installing updates that reduce operation downtime and potentially minimize it altogether while deploying new functionality in a backward compatible manner, if possible. On the other hand, data throughput can be increased by taking measures that minimize message footprint, such as using data compression and binary encoding the protocol messages. \ No newline at end of file +Any software updates to the p2p protocol must also scale progressively and consistently across all nodes. This translates into installing updates that reduce operation downtime and potentially minimize it altogether while deploying new functionality in a backward compatible manner, if possible. On the other hand, data throughput can be increased by taking measures that minimize message footprint, such as using data compression and binary encoding of the protocol messages. \ No newline at end of file From 167b04da99bc1a4ce7b3a74a19625a3c56e00175 Mon Sep 17 00:00:00 2001 From: dskvr Date: Sat, 8 Feb 2020 17:31:26 +0100 Subject: [PATCH 06/22] Use synonyms --- glossary.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/glossary.yaml b/glossary.yaml index c44eceb3..4d44d4db 100644 --- a/glossary.yaml +++ b/glossary.yaml @@ -148,10 +148,12 @@ terms: - name: "Irreversible Block" - definition: "Privileged accounts are accounts which can execute transactions while skipping the standard authorization check. To ensure that this is not a security hole, the permission authority over these accounts is granted to the eosio.prods account. An account can be set as privileged by sending the native action `setpriv` to an EOSIO based blockchain, specifying the account to be set as privileged, and providing the correct permission, or, by using cleos command line utility." name: Privileged - - definition: "Multiple Index Tables, or Multi Index Tables, are a way to cache state and/or data in RAM for fast access. Multi index tables support create, read, update, and delete (CRUD) operations, something which the blockchain doesn't (it only supports create and read). Multi index tables are stored in EOSIO RAM and each smart contract using a multi index table reserves a partition of the RAM cache. Access to each partition is controlled using the table name, code, and scope, and can have up to 16 indexes or indices defined." + - definition: "Multiple Index Tables, are a way to cache state and/or data in RAM for fast access. Multi index tables support create, read, update, and delete (CRUD) operations, something which the blockchain doesn't (it only supports create and read). Multi index tables are stored in EOSIO RAM and each smart contract using a multi index table reserves a partition of the RAM cache. Access to each partition is controlled using the table name, code, and scope, and can have up to 16 indexes or indices defined." name: "Multiple Index Table" related: - name: "Indices" + synonyms: + - "Multi-Index Tables" - definition: "nodeos plugins are software components that implement features that complement the native EOSIO blockchain basic implementation. They can be enabled or disabled through the nodeos configuration file or specifying them in the command line that launches the nodeos daemon." name: Plugin - definition: "Tables on an EOSIO based blockchain are achieved via Multiple Index Table." @@ -176,8 +178,11 @@ terms: name: "Transaction Reciept" - definition: "On completion of the transaction, a transaction receipt is generated. Receiving a transaction hash does not mean that the transaction has been confirmed, it only means that the node accepted it without error, which also means that there is a high probability other producers will accept it. A transaction is considered confirmed when a nodeos instance has received, processed, and written it to a block on the blockchain, i.e. it is in the head block or an earlier block." name: "Confirmed Transaction" - - definition: "Multisig or msig is a short term for multiple signatures. It’s used to describe the case in which one requires more than one account's permission to execute a transaction. EOSIO provides the system account eosio.msig, which can be used to push onto the blockchain the multisig proposals and their corresponding account's permission required to approve the proposal. Multisig, when used properly, increases the security of an account, the security of a smart contract, and it's also the method by which Block Producers are able to affect changes within an EOSIO blockchain." + - definition: "Multisig is a short term for multiple signatures. It’s used to describe the case in which one requires more than one account's permission to execute a transaction. EOSIO provides the system account eosio.msig, which can be used to push onto the blockchain the multisig proposals and their corresponding account's permission required to approve the proposal. Multisig, when used properly, increases the security of an account, the security of a smart contract, and it's also the method by which Block Producers are able to affect changes within an EOSIO blockchain." name: Multisig + synonyms: + - msig + - multiple signatures - definition: "A transaction is considered unconfirmed as long as no nodeos instance has received, processed, and written it to a block on the blockchain, i.e. it is not in the head block or a block earlier than the head block." name: "Unconfirmed Transaction" - definition: "WASM stands for WebAssembly. The EOSIO based blockchains execute user-generated applications and code using WebAssembly. WASM is an emerging web standard with widespread support of Google, Microsoft, Apple, and others. At the moment the most mature toolchain for building applications that compile to WASM is clang/llvm with their C/C++ compiler. For best compatibility, it is recommended that you use the EOSIO toolchain to generate WASM." From f1a620d84d4e0a0461df6361c6f593588bfc3ff9 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Mon, 10 Feb 2020 13:19:39 -0600 Subject: [PATCH 07/22] Typo fix The 'upsert' command set bob's last name to "is a guy", but in the read, it comes out as "is a loser"... Poor bob, the database doesn't like him. --- .../03_smart-contract-development/05_secondary-indices.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/02_getting-started/03_smart-contract-development/05_secondary-indices.md b/docs/02_getting-started/03_smart-contract-development/05_secondary-indices.md index 7b6484d4..e956934a 100755 --- a/docs/02_getting-started/03_smart-contract-development/05_secondary-indices.md +++ b/docs/02_getting-started/03_smart-contract-development/05_secondary-indices.md @@ -162,7 +162,7 @@ It should return },{ "key": "bob", "first_name": "bob", - "last_name": "is a loser", + "last_name": "is a guy", "age": 49, "street": "doesnt exist", "city": "somewhere", From eea6bb0f455c3caaa18ba2266068500cf2cbb4ca Mon Sep 17 00:00:00 2001 From: iamveritas Date: Thu, 13 Feb 2020 12:52:49 +0200 Subject: [PATCH 08/22] Fixes #149 --- docs/03_tutorials/bios-boot-sequence.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/03_tutorials/bios-boot-sequence.md b/docs/03_tutorials/bios-boot-sequence.md index c154392e..57b26e79 100644 --- a/docs/03_tutorials/bios-boot-sequence.md +++ b/docs/03_tutorials/bios-boot-sequence.md @@ -33,12 +33,10 @@ Alternatively, if you would like to automate these steps, you can use the [bios- If your goal is to go beyond and understand what the script is doing, you can follow this tutorial which will get you through the same steps explaining also along the way each step needed to go through. - ### 1.1. Install the binaries **Pre-compiled EOSIO Binaries** - For instructions to install the `nodeos` binaries, see the [Install EOSIO pre-compiled binaries](https://developers.eos.io/manuals/eos/latest/install/install-prebuilt-binaries) tutorial but do not start `nodeos` at this stage. **EOSIO.CDT Binaries** @@ -931,4 +929,4 @@ You can test various commands, create accounts, check balance on accounts, trans For commands on creating new accounts, see the [`Create test accounts`](../02_getting-started/02_development-environment/07_create-test-accounts.md) tutorial. For commands on issuing, allocating and transferring token between accounts, see the -[`Deploy, Issue and Transfer Tokens`getting-started/smart-contract-development/deploy-issue-and-transfer-tokens) tutorial. +[`Deploy, Issue and Transfer Tokens`](../02_getting-started/03_smart-contract-development/02_deploy-issue-and-transfer-tokens.md) section. From d5103071dc9f5c7a6d096b3b9d628aa6486bc458 Mon Sep 17 00:00:00 2001 From: Rakesh Ghatvisave Date: Fri, 14 Feb 2020 18:34:48 +0800 Subject: [PATCH 09/22] Added tools to the list --- manuals-directory.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/manuals-directory.yaml b/manuals-directory.yaml index fb9d7fef..3e0f6437 100644 --- a/manuals-directory.yaml +++ b/manuals-directory.yaml @@ -52,6 +52,14 @@ sections: - title: eosio-web-ide description: EOSIO Quickstart Web IDE lets developers start experiment building applications on EOSIO platform in a matter of minutes link: https://github.com/EOSIO/eosio-web-ide + + - title: demux-js + description: Demux is a backend infrastructure pattern for sourcing blockchain events to deterministically update queryable datastores and trigger side effects. + link: https://github.com/EOSIO/demux-js + + - title: history-tools + description: Set of tools built to facilitate highly performant searches, written in C++, that can efficiently and scalably sift through terabytes of data from the full history of EOSIO blockchains. + link: https://eosio.github.io/history-tools/ - title: Javascript SDK listings: From 45841776636c62c3fab3d8dd3f77df1136f0a146 Mon Sep 17 00:00:00 2001 From: Luis Paris Date: Wed, 19 Feb 2020 16:41:51 -0500 Subject: [PATCH 10/22] fix timestamp description for block schema --- docs/04_protocol/01_consensus_protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/04_protocol/01_consensus_protocol.md b/docs/04_protocol/01_consensus_protocol.md index 5251394f..ed281907 100644 --- a/docs/04_protocol/01_consensus_protocol.md +++ b/docs/04_protocol/01_consensus_protocol.md @@ -148,7 +148,7 @@ As an inter-chained sequence of blocks, the fundamental unit within the blockcha Name | Type | Description -|-|- -`timestamp` | `block_timestamp_type` | block creation time (before any transactions are included) +`timestamp` | `block_timestamp_type` | ideal time this block was produced (ends in .000 or .500 seconds) `producer` | `name` | account name for producer of this block `confirmed` | `uint16_t` | number of prior blocks confirmed by the producer of this block in current producer schedule `previous` | `block_id_type` | block ID for previous block From b214d5a5ed92bb6bae49ea346894f5408032be20 Mon Sep 17 00:00:00 2001 From: Luis Paris Date: Thu, 20 Feb 2020 10:19:21 -0500 Subject: [PATCH 11/22] improve timestamp description further --- docs/04_protocol/01_consensus_protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/04_protocol/01_consensus_protocol.md b/docs/04_protocol/01_consensus_protocol.md index ed281907..d46eb8e2 100644 --- a/docs/04_protocol/01_consensus_protocol.md +++ b/docs/04_protocol/01_consensus_protocol.md @@ -148,7 +148,7 @@ As an inter-chained sequence of blocks, the fundamental unit within the blockcha Name | Type | Description -|-|- -`timestamp` | `block_timestamp_type` | ideal time this block was produced (ends in .000 or .500 seconds) +`timestamp` | `block_timestamp_type` | expected time slot this block is produced (ends in .000 or .500 seconds) `producer` | `name` | account name for producer of this block `confirmed` | `uint16_t` | number of prior blocks confirmed by the producer of this block in current producer schedule `previous` | `block_id_type` | block ID for previous block From 2ff299c56ba4b710c1d3173552de1c6a1252c313 Mon Sep 17 00:00:00 2001 From: Rakesh Ghatvisave Date: Fri, 21 Feb 2020 21:00:31 +0800 Subject: [PATCH 12/22] Relocated and edited the note about killing keosd --- .../06_start-your-node-setup.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md b/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md index 8c40a401..78b2ba06 100755 --- a/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md +++ b/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md @@ -24,6 +24,16 @@ info 2018-11-26T06:54:24.796 thread-0 http_plugin.cpp:554 add_handle ``` Press enter to continue +**Troubleshooting** + +After entering `keosd &`, you may encounter this message: + +```shell +"3120000 wallet_exception: Wallet exception Failed to lock access to wallet directory; is another keosd running?" +``` + +This is because another instance of `keosd` process might be running in the background. Kill all instances by `pkill keosd` and rerun `keosd &`. + ### Step 1.2: Start nodeos Start nodeos now: @@ -52,11 +62,9 @@ These settings accomplish the following: [[warning]] | In the above configuration, CORS is enabled for `*` **for development purposes only**, you should **never** enable CORS for `*` on a node that is publicly accessible! -### Troubleshooting - -After entering `keosd &`, if you encounter a message saying "3120000 wallet_exception: Wallet exception Failed to lock access to wallet directory; is another keosd running?", you may have already had `keosd` processes running in the background. Try killing them by, for example, `pkill keosd`. +**Troubleshooting** -If in the previous step, after starting `nodeos`, you see an error message similar to "Database dirty flag set (likely due to unclean shutdown): replay required" try to start `nodeos` with `--replay-blockchain`. More details on troubleshooting `nodeos` can be found [here](https://developers.eos.io/manuals/eos/latest/nodeos/troubleshooting/index). +After starting `nodeos`, you see an error message similar to "Database dirty flag set (likely due to unclean shutdown): replay required" try to start `nodeos` with `--replay-blockchain`. More details on troubleshooting `nodeos` can be found [here](https://developers.eos.io/manuals/eos/latest/nodeos/troubleshooting/index). ## Step 2: Check the installation From 429a4a64cad7bdb603c51ad70d8a3f80644d4d54 Mon Sep 17 00:00:00 2001 From: iamveritas Date: Mon, 24 Feb 2020 13:28:17 +0200 Subject: [PATCH 13/22] add chain controller signals --- docs/04_protocol/03_network_peer_protocol.md | 159 ++++++++++++++++++- 1 file changed, 157 insertions(+), 2 deletions(-) diff --git a/docs/04_protocol/03_network_peer_protocol.md b/docs/04_protocol/03_network_peer_protocol.md index 903f9797..bfbd34c7 100644 --- a/docs/04_protocol/03_network_peer_protocol.md +++ b/docs/04_protocol/03_network_peer_protocol.md @@ -164,13 +164,168 @@ Each node constructs its own local copy of the blockchain as it receives blocks All irreversible blocks constructed in a node are expected to match those from other nodes up to the last irreversible block (LIB) of each node. This is the distributed nature of the blockchain. Eventually, as the blocks that follow the LIB block reach finality, the LIB block moves up the chain through one of the branches as it catches up with the head block (HB). When the LIB block advances, the immutable blockchain effectively grows. In this process, the head block might switch branches multiple times depending on the potential head block numbers received and their timestamps, which is ultimately used as tiebreaker. - ## 2.2. Chain Controller The Chain Controller manages the basic operations on blocks and transactions that change the local chain state, such as validating and executing transactions, pushing blocks, etc. The Chain Controller receives commands from the Net Plugin and dispatches the proper operation on a block or a transaction based on the network message received by the Net Plugin. The network messages are exchanged continuously between the EOSIO nodes as they communicate with each other to sync the state of blocks and transactions. +### 2.2.1. Signals' Producer and Consumer + +The producer and consumer of the signals defined in the controller and their life cycle during normal operation, fork, and replay are as follows: + +#### pre_accepted_block (carry `signed_block_ptr`) + +- Produced by + +| Module | Function | Condition | +| --- | --- | --- | +| controller | push_block | before the block is added to the fork db | +| | replay_push_block | before the replayed block is added to the fork db (only if the replayed block is not irreversible since irreversible block is not added to fork db during replay) | + +- Consumed by + +| Module | Usage | +| --- | --- | +| chain_plugin | checkpoint validation | +| | forward data to pre_accepted_block_channel | + +#### accepted_block_header (carry `block_state_ptr`) + +- Produced by + +| Module | Function | Condition | +| --- | --- | --- | +| controller | push_block| after the block is added to fork db | +| | commit_block | after the block is added to fork db (only if you are the one who produce the block, in other words, this is not applicable to the block received from others) | +| | replay_push_block | after the replayed block is added to fork db | (only if the replayed block is not irreversible since irreversible block is not added to fork db during replay) | + +- Consumed by + +| Module | Usage | +| --- | --- | +| chain_plugin | forward data to accepted_block_header_channel | + +#### accepted_block (carry `block_state_ptr`) + +- Produced by + +| Module | Function | Condition | +| --- | --- | --- | +| controller | commit_block | when the block is finalized | + +- Consumed by + +| Module | Usage | +| --- | --- | +| net_plugin | broadcast block to other peers | + +#### irreversible_block (carry `block_state_ptr`) + +- Produced by + +| Module | Function | Condition | +| --- | --- | --- | +| controller | log_irreversible | before it's appended to the block log and before the chainbase db is committed | +| | replay_push_block | when replaying an irreversible block | + +- Consumed by + +| Module | Usage | +| --- | --- | +| controller | setting the current lib of wasm_interface | +| chain_plugin | forward data to irreversible_block_channel | +| mongodb_plugin | forward the data to irreversible_block_state_queue | + +#### accepted_transaction (carry `transaction_metadata_ptr`) + +- Produced by + +| Module | Function | Condition | +| --- | --- | --- | +| controller | push_transaction | when the transaction executes succesfully (only once, i.e. when it's unapplied and reapplied the signal won't be emitted) | +| | push_scheduled_transaction | when the scheduled transaction executes succesfully | +| | | when the scheduled transaction fails (subjective/ soft/ hard) | +| | | when the scheduled transaction expires | +| | | after applying onerror | + +- Consumed by + +| Module | Usage | +| --- | --- | +| chain_plugin | forward data to accepted_transaction_channel | +| mongodb_plugin | forward the data to transaction_metadata_queue | + +#### applied_transaction (carry `std::tuple`) + +- Produced by + +| Module | Function | Condition | +| --- | --- | --- | +| controller | push_transaction | when the transaction executes succesfully | +| | push_scheduled_transaction | when the scheduled transaction executes succesfully | +| | | when the scheduled transaction fails (subjective/ soft/ hard) | +| | | when the scheduled transaction expires | +| | | after applying onerror | + +- Consumed by + +| Module | Usage | +| --- | --- | +| chain_plugin | forward data to applied_transaction_channel | +| mongodb_plugin | forward the data to transaction_trace_queue | + +#### bad_alloc +Not used. + +### 2.2.2. Signals' Life Cycle + +#### A. normal operation where blocks and transactions are input -### 2.2.1. Fork Database +1. When a transaction is pushed to the blockchain (through RPC or broadcasted by peer) + 1. Transaction is executed either succesfully/ fail the validation -> `accepted_transaction` is emitted by the controller + 2. chain_plugin will react to the signal to forward the transaction_metadata to accepted_transaction_channel + 3. mongodb_plugin will react to the signal and add the transaction_metadata to its queue to be processed later on +2. When a scheduled transaction is pushed to the blockchain + 1. Transaction is executed either succesfully/ fail subjectively/ soft fail/ hard fail -> `accepted_transaction` is emitted by the controller + 2. chain_plugin will react to the signal to forward the transaction_metadata to accepted_transaction_channel + 3. mongodb_plugin will react to the signal and add the transaction_metadata to its queue to be processed later on +3. When a block is pushed to the blockchain (through RPC or broadcasted by peer) + 1. Before the block is added to fork db -> `pre_accepted_block` will be emitted by the controller + 2. chain_plugin will react to the signal to do validation of the block forward the block_state to accepted_block_header_channel and validate it with the checkpoint + 3. After the block is added to fork db -> `accepted_block_header` will be emitted by the controller + 4. chain_plugin will react to the signal to forward the block_state to accepted_block_header_channel + 5. Then the block will be applied, at this time all the transactions and scheduled_transactions inside the block will be pushed. All signals related to push_transaction and push_scheduled_transaction (see point A.1 and A.2) will be emitted. + 6. When committing the block -> `accepted_block` will be emitted by the controller + 7. net_plugin will react to the signal and broadcast the block to the peers + 8. If a new block becomes irreversible, signals related to irreversible block will be emitted (see point A.5) +4. When a block is produced + 1. For the block that is produced by you, the block will be added to the fork_db when it is committed -> `accepted_block_header` will be emitted by the controller + 2. chain_plugin will react to the signal to forward the block_state to accepted_block_header_channel and validate it with the checkpoint + 3. Immediately after that (during commiting the block) -> `accepted_block` will be emitted by the controller + 4. net_plugin will react to the signal and broadcast the block to the peers + 5. If a new block becomes irreversible, signals related to irreversible block will be emitted (see point A.5) +5. When a block becomes irreversible + 1. Once a block is deemed irreversible -> `irreversible_block` will be emitted by the controller before the block is appended to the block log and the chainbase db is committed + 2. chain_plugin will react to the signal to forward the block_state to irreversible_block_channel and also set the lib of wasm_interface + 3. mongodb_plugin will react to the signal and add the transaction_metadata to its queue to be processed later on + +#### B. operation where forks are presented and resolved + +1. When forks are presented, the blockchain will pop all existing blocks up to the forking point and then apply all new blocks in the fork. +2. When applying the new block, all the transactions and scheduled_transactions inside the block will be pushed. All signals related to push_transaction and push_scheduled_transaction (see point A.1 and A.2) will be emitted. +3. And then when committing the new block -> `accepted_block` will be emitted by the controller +4. net_plugin will react to the signal and broadcast the block to the peers +5. If If a new block becomes irreversible, signals related to irreversible block will be emitted (see point A.5) + +#### C. normal replay (with or without replay optimization) + +1. When replaying irreversible block -> `irreversible_block` will be emitted by the controller +2. Refer to A.5 to see how `irreversible_block` signal is responded +3. When replaying reversible block, before the block is added to fork_db -> `pre_accepted_block` will be emitted by the controller +4. When replaying reversible block, after the block is added to fork db -> `accepted_block_header` will be emitted by the controller +5. When replaying reversible block, when the block is committed -> `accepted_block` will be emitted by the controller +6. Refer to A.3 to see how `pre_accepted_block`, `accepted_block_header` and `accepted_block` signal are responded + +### 2.2.3. Fork Database The Fork Database (Fork DB) provides an internal interface for the Chain Controller to perform operations on the node’s local chain. As new blocks are received from other peers, the Chain Controller pushes these blocks to the Fork DB. Each block is then cryptographically linked to a previous block. Since there might be more than one previous block, the process is likely to produce temporary branches called mini-forks. Thus, the Fork DB serves three main purposes: From c66a6f86dadd7fe5ff0dcd25e9336aa3ffacd39c Mon Sep 17 00:00:00 2001 From: iamveritas Date: Tue, 25 Feb 2020 09:55:32 +0200 Subject: [PATCH 14/22] taking out the back ticks from the titles --- docs/04_protocol/03_network_peer_protocol.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/04_protocol/03_network_peer_protocol.md b/docs/04_protocol/03_network_peer_protocol.md index bfbd34c7..dde385c1 100644 --- a/docs/04_protocol/03_network_peer_protocol.md +++ b/docs/04_protocol/03_network_peer_protocol.md @@ -159,7 +159,6 @@ digraph { Each node constructs its own local copy of the blockchain as it receives blocks and transactions and syncs their state with other peers. The reversible blocks are those new blocks received that have not yet reached finality. As such, they are likely to form branches that stem from a main common ancestor, which is the LIB (last irreversible block). Other common ancestors different from the LIB are also possible for reversible blocks. In fact, any two sibling branches always have a nearest common ancestor. For instance, in the diagram above, block 52b is the nearest common ancestor for the branches starting at block 53a and 53b that is different from the LIB. Every active branch in the local chain has the potential to become part of the blockchain. - ### 2.1.1. LIB Block All irreversible blocks constructed in a node are expected to match those from other nodes up to the last irreversible block (LIB) of each node. This is the distributed nature of the blockchain. Eventually, as the blocks that follow the LIB block reach finality, the LIB block moves up the chain through one of the branches as it catches up with the head block (HB). When the LIB block advances, the immutable blockchain effectively grows. In this process, the head block might switch branches multiple times depending on the potential head block numbers received and their timestamps, which is ultimately used as tiebreaker. @@ -172,7 +171,7 @@ The Chain Controller manages the basic operations on blocks and transactions tha The producer and consumer of the signals defined in the controller and their life cycle during normal operation, fork, and replay are as follows: -#### pre_accepted_block (carry `signed_block_ptr`) +#### pre_accepted_block (carry signed_block_ptr) - Produced by @@ -188,7 +187,7 @@ The producer and consumer of the signals defined in the controller and their lif | chain_plugin | checkpoint validation | | | forward data to pre_accepted_block_channel | -#### accepted_block_header (carry `block_state_ptr`) +#### accepted_block_header (carry block_state_ptr) - Produced by @@ -204,7 +203,7 @@ The producer and consumer of the signals defined in the controller and their lif | --- | --- | | chain_plugin | forward data to accepted_block_header_channel | -#### accepted_block (carry `block_state_ptr`) +#### accepted_block (carry block_state_ptr) - Produced by @@ -218,7 +217,7 @@ The producer and consumer of the signals defined in the controller and their lif | --- | --- | | net_plugin | broadcast block to other peers | -#### irreversible_block (carry `block_state_ptr`) +#### irreversible_block (carry block_state_ptr) - Produced by @@ -235,7 +234,7 @@ The producer and consumer of the signals defined in the controller and their lif | chain_plugin | forward data to irreversible_block_channel | | mongodb_plugin | forward the data to irreversible_block_state_queue | -#### accepted_transaction (carry `transaction_metadata_ptr`) +#### accepted_transaction (carry transaction_metadata_ptr) - Produced by @@ -254,7 +253,7 @@ The producer and consumer of the signals defined in the controller and their lif | chain_plugin | forward data to accepted_transaction_channel | | mongodb_plugin | forward the data to transaction_metadata_queue | -#### applied_transaction (carry `std::tuple`) +#### applied_transaction (carry std::tuple) - Produced by From d23b18e802461b6053ee4b3a86d37692bacd47d1 Mon Sep 17 00:00:00 2001 From: dixia <667070+dixia@users.noreply.github.com> Date: Wed, 26 Feb 2020 15:12:41 +0800 Subject: [PATCH 15/22] minor change minor change --- .../02_development-environment/06_start-your-node-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md b/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md index 78b2ba06..71225071 100755 --- a/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md +++ b/docs/02_getting-started/02_development-environment/06_start-your-node-setup.md @@ -64,7 +64,7 @@ These settings accomplish the following: **Troubleshooting** -After starting `nodeos`, you see an error message similar to "Database dirty flag set (likely due to unclean shutdown): replay required" try to start `nodeos` with `--replay-blockchain`. More details on troubleshooting `nodeos` can be found [here](https://developers.eos.io/manuals/eos/latest/nodeos/troubleshooting/index). +After starting `nodeos`, if you see an error message similar to "Database dirty flag set (likely due to unclean shutdown): replay required", try to start `nodeos` with `--replay-blockchain`. More details on troubleshooting `nodeos` can be found [here](https://developers.eos.io/manuals/eos/latest/nodeos/troubleshooting/index). ## Step 2: Check the installation From 0eaa159ddc6c86e4c4d2a90f069a82e2a1745082 Mon Sep 17 00:00:00 2001 From: Luis Paris Date: Mon, 2 Mar 2020 12:46:40 -0500 Subject: [PATCH 16/22] fix outdated link in consensus protocol --- docs/04_protocol/01_consensus_protocol.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/04_protocol/01_consensus_protocol.md b/docs/04_protocol/01_consensus_protocol.md index d46eb8e2..e7d9dd7a 100644 --- a/docs/04_protocol/01_consensus_protocol.md +++ b/docs/04_protocol/01_consensus_protocol.md @@ -195,7 +195,7 @@ After the transactions have been pushed into the block and the block is finalize ### 5.2.4. Commit Block -After the block is signed, it is committed to the local chain. This pushes the block to the reversible block database (see [Network Peer Protocol: 2.2.1. Fork Database](03_network_peer_protocol.md#221-fork-database)). This makes the block available for syncing with other nodes for validation (see the [Network Peer Protocol](03_network_peer_protocol.md) for more information about block syncing). +After the block is signed, it is committed to the local chain. This pushes the block to the reversible block database (see [Network Peer Protocol: 2.2.3. Fork Database](03_network_peer_protocol.md#223-fork-database)). This makes the block available for syncing with other nodes for validation (see the [Network Peer Protocol](03_network_peer_protocol.md) for more information about block syncing). ## 5.3. Block Validation From cef3317e146137b09ce05f2c190b5b8797cae169 Mon Sep 17 00:00:00 2001 From: bobgt Date: Thu, 12 Mar 2020 16:10:35 +0800 Subject: [PATCH 17/22] community tools list --- docs.json | 13 +++++++- docs/05_community-tools/index.md | 51 ++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 docs/05_community-tools/index.md diff --git a/docs.json b/docs.json index 6b4f8f7b..5de6a7d4 100644 --- a/docs.json +++ b/docs.json @@ -6,7 +6,7 @@ "options": { "docs_dir": "docs", "disable_indices": true, - "exclude": ["get-involved"] + "exclude": ["get-involved", "05_community-tools"] } }, { @@ -33,6 +33,17 @@ "directory_nav_parent": "Resources" } }, + + + { + "name": "collate_markdown", + "options": { + "docs_dir": "docs/05_community-tools", + "output_dir": "05_community-tools" + } + }, + + { "name": "collate_markdown", "options": { diff --git a/docs/05_community-tools/index.md b/docs/05_community-tools/index.md new file mode 100644 index 00000000..ddd540b6 --- /dev/null +++ b/docs/05_community-tools/index.md @@ -0,0 +1,51 @@ + + +## Overview +Welcome to the EOSIO Community Tools Directory. This is a list of developer tools which are built by members of the EOSIO community, curated by the Developer Relations team at Block.one. +If you would like to submit a tool to be added to the list, click **Edit** at the right hand side of this page and submit a Pull Request or fill in this form: [link] + +[[info | Disclaimer]] +| The information, links and other material on the website relating to third-party software, hardware, services, networks, blockchains (whether public or private), websites or other resources are provided on an “as-is” basis for your convenience only. Such resources may be updated, changed or terminated at any time so the information included may be out of date or inaccurate. The inclusion of any third-party resources does not constitute approval, endorsement or recommendation by us and we disclaim all responsibility and liability for your use of any such third-party resources. + + + +## Tools Directory + + +### Testing Tools + +* [Azakazam](https://github.com/azarusio/AZAkazam): A development, testing and deployment framework for EOSIO, aiming to make life easier for developers. + +* [Lamington](https://github.com/CoinageCrypto/lamington): The Lamington library includes CLI tools and JavaScript utilities to streamline the EOSIO smart contract building, testing and deployment pipeline. + +### EOSFactory +* [EOSFactory](https://github.com/tokenika/eosfactory): A Python-based EOS smart-contract development and testing framework. + +### Integrated Development Environments (IDEs) +* [EOS Studio](https://www.eosstudio.io/): Integrated with various tools required for EOSIO in a unified graphical application, EOS Studio provides a powerful and easy-to-use environment for dApp development. + +### Non-Fungible Token (NFT) Standards +* [dGoods](https://github.com/MythicalGames/dgoods): An open source and free standard for handling the virtual representation of items, both digital and physical. +* [SimpleAssets](https://github.com/EOSIO/eosjs-keygen): A simple standard for digital assets on EOSIO blockchains: Non-Fungible Tokens (NFTs), Fungible Tokens (FTs), and Non-Transferable Tokens (NTTs). + +### Services and Middleware +* [The DAPP Network](https://liquidapps.io/): Live, universal middleware of services for modern decentralized applications. + +* [dfuse](https://www.dfuse.io/en): Blockchain data APIs for searching and monitoring EOSIO networks. + +### History Solutions +* [Hyperion History API](https://github.com/eosrio/Hyperion-History-API): A scalable, Full History API Solution for EOSIO based-blockchains + +### Testnets +* [CryptoKylin Testnet](https://www.cryptokylin.io/): CryptoKylin Testnet is for dApp developers who want to test their EOSIO smart contracts before deploying on production networks. + +* [Jungle Testnet](https://github.com/EOS-Jungle-Testnet): A live EOSIO testnet with network monitor. + +* [The EOSIO Testnet](https://testnet.eos.io/): Block.one's EOSIO Testnet to test EOSIO smart contracts before deploying on production networks. + +### Block Explorers +* [Bloks.io](https://bloks.io/): Block explorer with several features across many EOSIO blockchain networks. + +### EOSIO Plugins +* [EOSIO Kafka Plugin](https://github.com/TP-Lab/kafka_plugin): This plugin allows you to utilize all of Kafka's rich real-time features for building date pipelines and streaming apps. + From e48b598b3840978dcbda8e4edce305b8f5948f25 Mon Sep 17 00:00:00 2001 From: bobgt Date: Thu, 12 Mar 2020 17:13:34 +0800 Subject: [PATCH 18/22] deleted whitespace --- docs/05_community-tools/index.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/05_community-tools/index.md b/docs/05_community-tools/index.md index ddd540b6..e1135a5b 100644 --- a/docs/05_community-tools/index.md +++ b/docs/05_community-tools/index.md @@ -7,14 +7,11 @@ If you would like to submit a tool to be added to the list, click **Edit** at th [[info | Disclaimer]] | The information, links and other material on the website relating to third-party software, hardware, services, networks, blockchains (whether public or private), websites or other resources are provided on an “as-is” basis for your convenience only. Such resources may be updated, changed or terminated at any time so the information included may be out of date or inaccurate. The inclusion of any third-party resources does not constitute approval, endorsement or recommendation by us and we disclaim all responsibility and liability for your use of any such third-party resources. - - ## Tools Directory - ### Testing Tools -* [Azakazam](https://github.com/azarusio/AZAkazam): A development, testing and deployment framework for EOSIO, aiming to make life easier for developers. +* [Azakazam](https://github.com/azarusio/azakazam): A development, testing and deployment framework for EOSIO, aiming to make life easier for developers. * [Lamington](https://github.com/CoinageCrypto/lamington): The Lamington library includes CLI tools and JavaScript utilities to streamline the EOSIO smart contract building, testing and deployment pipeline. @@ -47,5 +44,4 @@ If you would like to submit a tool to be added to the list, click **Edit** at th * [Bloks.io](https://bloks.io/): Block explorer with several features across many EOSIO blockchain networks. ### EOSIO Plugins -* [EOSIO Kafka Plugin](https://github.com/TP-Lab/kafka_plugin): This plugin allows you to utilize all of Kafka's rich real-time features for building date pipelines and streaming apps. - +* [EOSIO Kafka Plugin](https://github.com/TP-Lab/kafka_plugin): This plugin allows you to utilize all of Kafka's rich real-time features for building date pipelines and streaming apps. \ No newline at end of file From a7f1a535e776be760641c96a327f3fee022e864b Mon Sep 17 00:00:00 2001 From: bobgt Date: Thu, 12 Mar 2020 17:16:01 +0800 Subject: [PATCH 19/22] minor changes --- docs/05_community-tools/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/05_community-tools/index.md b/docs/05_community-tools/index.md index e1135a5b..e7f69bd6 100644 --- a/docs/05_community-tools/index.md +++ b/docs/05_community-tools/index.md @@ -1,8 +1,8 @@ ## Overview -Welcome to the EOSIO Community Tools Directory. This is a list of developer tools which are built by members of the EOSIO community, curated by the Developer Relations team at Block.one. -If you would like to submit a tool to be added to the list, click **Edit** at the right hand side of this page and submit a Pull Request or fill in this form: [link] +Welcome to the EOSIO Community Tools Directory. This is a list of developer tools that are built by members of the EOSIO community, curated by the Developer Relations team at Block.one. +If you would like to submit a tool to be added to the list, click **Edit** at the right hand-side of this page and submit a Pull Request or fill in this form: [link] [[info | Disclaimer]] | The information, links and other material on the website relating to third-party software, hardware, services, networks, blockchains (whether public or private), websites or other resources are provided on an “as-is” basis for your convenience only. Such resources may be updated, changed or terminated at any time so the information included may be out of date or inaccurate. The inclusion of any third-party resources does not constitute approval, endorsement or recommendation by us and we disclaim all responsibility and liability for your use of any such third-party resources. @@ -11,7 +11,7 @@ If you would like to submit a tool to be added to the list, click **Edit** at th ### Testing Tools -* [Azakazam](https://github.com/azarusio/azakazam): A development, testing and deployment framework for EOSIO, aiming to make life easier for developers. +* [Azakazam](https://github.com/azarusio/azakazam): A development, testing, and deployment framework for EOSIO, aiming to make life easier for developers. * [Lamington](https://github.com/CoinageCrypto/lamington): The Lamington library includes CLI tools and JavaScript utilities to streamline the EOSIO smart contract building, testing and deployment pipeline. @@ -44,4 +44,4 @@ If you would like to submit a tool to be added to the list, click **Edit** at th * [Bloks.io](https://bloks.io/): Block explorer with several features across many EOSIO blockchain networks. ### EOSIO Plugins -* [EOSIO Kafka Plugin](https://github.com/TP-Lab/kafka_plugin): This plugin allows you to utilize all of Kafka's rich real-time features for building date pipelines and streaming apps. \ No newline at end of file +* [EOSIO Kafka Plugin](https://github.com/TP-Lab/kafka_plugin): This plugin allows you to utilize all of Kafka's rich real-time features for building data pipelines and streaming apps. \ No newline at end of file From f06fa6bc396676592a30307254409fd5d9934f82 Mon Sep 17 00:00:00 2001 From: duncand0nuts Date: Fri, 13 Mar 2020 16:22:09 +0800 Subject: [PATCH 20/22] change list title, add form link, fix sections --- docs.json | 10 ++++----- .../index.md | 21 +++++++++++-------- 2 files changed, 17 insertions(+), 14 deletions(-) rename docs/{05_community-tools => 05_community-dev-tools}/index.md (84%) diff --git a/docs.json b/docs.json index 5de6a7d4..42a75976 100644 --- a/docs.json +++ b/docs.json @@ -6,7 +6,7 @@ "options": { "docs_dir": "docs", "disable_indices": true, - "exclude": ["get-involved", "05_community-tools"] + "exclude": ["get-involved", "05_community-dev-tools"] } }, { @@ -33,13 +33,13 @@ "directory_nav_parent": "Resources" } }, - - + + { "name": "collate_markdown", "options": { - "docs_dir": "docs/05_community-tools", - "output_dir": "05_community-tools" + "docs_dir": "docs/05_community-dev-tools", + "output_dir": "05_community-dev-tools" } }, diff --git a/docs/05_community-tools/index.md b/docs/05_community-dev-tools/index.md similarity index 84% rename from docs/05_community-tools/index.md rename to docs/05_community-dev-tools/index.md index e1135a5b..ffc7cfcd 100644 --- a/docs/05_community-tools/index.md +++ b/docs/05_community-dev-tools/index.md @@ -1,21 +1,18 @@ ## Overview -Welcome to the EOSIO Community Tools Directory. This is a list of developer tools which are built by members of the EOSIO community, curated by the Developer Relations team at Block.one. -If you would like to submit a tool to be added to the list, click **Edit** at the right hand side of this page and submit a Pull Request or fill in this form: [link] +This is a list of developer tools which are built by members of the EOSIO community, curated by the Developer Relations team at Block.one. -[[info | Disclaimer]] -| The information, links and other material on the website relating to third-party software, hardware, services, networks, blockchains (whether public or private), websites or other resources are provided on an “as-is” basis for your convenience only. Such resources may be updated, changed or terminated at any time so the information included may be out of date or inaccurate. The inclusion of any third-party resources does not constitute approval, endorsement or recommendation by us and we disclaim all responsibility and liability for your use of any such third-party resources. +If you would like to submit a tool to be added to the list, click **Edit** at the right hand side of this page and submit a Pull Request or fill in [this form](https://blockone.typeform.com/to/gA4F0Q). -## Tools Directory +## Community Dev Tools -### Testing Tools +### Testing Tools and Frameworks * [Azakazam](https://github.com/azarusio/azakazam): A development, testing and deployment framework for EOSIO, aiming to make life easier for developers. * [Lamington](https://github.com/CoinageCrypto/lamington): The Lamington library includes CLI tools and JavaScript utilities to streamline the EOSIO smart contract building, testing and deployment pipeline. -### EOSFactory * [EOSFactory](https://github.com/tokenika/eosfactory): A Python-based EOS smart-contract development and testing framework. ### Integrated Development Environments (IDEs) @@ -27,7 +24,7 @@ If you would like to submit a tool to be added to the list, click **Edit** at th ### Services and Middleware * [The DAPP Network](https://liquidapps.io/): Live, universal middleware of services for modern decentralized applications. - + * [dfuse](https://www.dfuse.io/en): Blockchain data APIs for searching and monitoring EOSIO networks. ### History Solutions @@ -44,4 +41,10 @@ If you would like to submit a tool to be added to the list, click **Edit** at th * [Bloks.io](https://bloks.io/): Block explorer with several features across many EOSIO blockchain networks. ### EOSIO Plugins -* [EOSIO Kafka Plugin](https://github.com/TP-Lab/kafka_plugin): This plugin allows you to utilize all of Kafka's rich real-time features for building date pipelines and streaming apps. \ No newline at end of file +* [EOSIO Kafka Plugin](https://github.com/TP-Lab/kafka_plugin): This plugin allows you to utilize all of Kafka's rich real-time features for building date pipelines and streaming apps. + +## Software Development Kits (SDKs) +* [Zeus SDK](https://github.com/liquidapps-io/zeus-sdk): The Zeus SDK offers a number of functionalities including a command line tool, templates, and a package manager. + +[[info | Disclaimer]] +| The information, links and other material on the website relating to third-party software, hardware, services, networks, blockchains (whether public or private), websites or other resources are provided on an “as-is” basis for your convenience only. Such resources may be updated, changed or terminated at any time so the information included may be out of date or inaccurate. The inclusion of any third-party resources does not constitute approval, endorsement or recommendation by us and we disclaim all responsibility and liability for your use of any such third-party resources. From 9c89a37f4ea1fbaece3bf289cd76500c9ce4af74 Mon Sep 17 00:00:00 2001 From: iamveritas Date: Mon, 16 Mar 2020 16:18:42 +0200 Subject: [PATCH 21/22] resolves #31 the buttons/links/menu actions to be called "Get Started" and the title of the page where the button/link/menu action transfer the user to should be "Getting Started". --- docs/02_getting-started/01_try-eosio.md | 2 +- docs/02_getting-started/index.md | 9 +++++++-- docs/index.md | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/02_getting-started/01_try-eosio.md b/docs/02_getting-started/01_try-eosio.md index 205e27d3..4bb9fcbd 100644 --- a/docs/02_getting-started/01_try-eosio.md +++ b/docs/02_getting-started/01_try-eosio.md @@ -8,4 +8,4 @@ If you do not want to install `EOSIO` binaries on your local machine, or if you You can give it a try in a matter of seconds [right now](https://gitpod.io/#https://github.com/EOSIO/eosio-web-ide) and you can read more details about it [on the eosio-web-ide project page](https://github.com/EOSIO/eosio-web-ide). ## What's Next? -- [Getting Started](./02_development-environment/02_introduction.md): Install EOSIO in your local development environment. +- [Get Started](./02_development-environment/02_introduction.md): Install EOSIO in your local development environment. diff --git a/docs/02_getting-started/index.md b/docs/02_getting-started/index.md index 52c1aa2d..1057b7aa 100644 --- a/docs/02_getting-started/index.md +++ b/docs/02_getting-started/index.md @@ -1,4 +1,8 @@ -## Topics Covered in Getting Started +--- +content_title: "Getting Started" +link_text: "Get Started" +--- + - Installing eosio.cdt - Using Keosd as a local development wallet - Starting the Nodeos daemon @@ -10,5 +14,6 @@ - Payable actions using EOSIO `notify` declarations ## What's next? + - [Try EOSIO](./01_try-eosio.md): Try EOSIO in your browser with Gitpod. -- [Getting Started](./02_development-environment/introduction.md): Install EOSIO in your local development environment. +- [Get Started](./02_development-environment/introduction.md): Install EOSIO in your local development environment. diff --git a/docs/index.md b/docs/index.md index 8b6f1bf4..4427f9bf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -20,6 +20,6 @@ The transactions recorded on the blockchain form an immutable history of the blo `youtube: https://www.youtube.com/watch?v=MqSE5WLusko` ## What's Next? -- [Getting Started](./02_getting-started/index.md): Learn how to develop on an EOSIO blockchain +- [Get Started](./02_getting-started/index.md): Learn how to develop on an EOSIO blockchain - [Protocol](./04_protocol/index.md): Understand the protocols that makes up an EOSIO blockchain - [Get Involved](./get-involved/index.md): Learn how to get involved and contribute to the EOSIO ecosystem. From 36c632af012f08a1b8651417bb61b84cb1870353 Mon Sep 17 00:00:00 2001 From: duncand0nuts Date: Tue, 17 Mar 2020 16:50:48 +0800 Subject: [PATCH 22/22] change title --- docs.json | 6 +++--- .../index.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) rename docs/{05_community-dev-tools => 05_community-developer-tools}/index.md (93%) diff --git a/docs.json b/docs.json index 42a75976..14e0b01b 100644 --- a/docs.json +++ b/docs.json @@ -6,7 +6,7 @@ "options": { "docs_dir": "docs", "disable_indices": true, - "exclude": ["get-involved", "05_community-dev-tools"] + "exclude": ["get-involved", "05_community-developer-tools"] } }, { @@ -38,8 +38,8 @@ { "name": "collate_markdown", "options": { - "docs_dir": "docs/05_community-dev-tools", - "output_dir": "05_community-dev-tools" + "docs_dir": "docs/05_community-developer-tools", + "output_dir": "05_community-developer-tools" } }, diff --git a/docs/05_community-dev-tools/index.md b/docs/05_community-developer-tools/index.md similarity index 93% rename from docs/05_community-dev-tools/index.md rename to docs/05_community-developer-tools/index.md index 234e5951..66da6a1a 100644 --- a/docs/05_community-dev-tools/index.md +++ b/docs/05_community-developer-tools/index.md @@ -3,9 +3,9 @@ ## Overview This is a list of developer tools which are built by members of the EOSIO community, curated by the Developer Relations team at Block.one. -If you would like to submit a tool to be added to the list, click **Edit** at the right hand side of this page and submit a Pull Request or fill in [this form](https://blockone.typeform.com/to/gA4F0Q). +If you would like to submit a tool to be added to the list, please fill in [this form](https://blockone.typeform.com/to/gA4F0Q). -## Community Dev Tools +## Community Developer Tools ### Testing Tools and Frameworks