From 134be806f52b9b49300e8dde006f38eb49c207e4 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Tue, 6 Jul 2021 16:36:41 +0200 Subject: [PATCH 01/14] doc: unflatten sections structure in gadt.rst --- docs/developer/gadt.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/developer/gadt.rst b/docs/developer/gadt.rst index 1de111caa0b0..836830d516ec 100644 --- a/docs/developer/gadt.rst +++ b/docs/developer/gadt.rst @@ -1,3 +1,4 @@ +======================================== Generalized Algebraic Data Types (GADTs) ======================================== -- GitLab From da529947f3a2dc94b485a03b4468639448855699 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Tue, 6 Jul 2021 17:35:34 +0200 Subject: [PATCH 02/14] doc: explain impact of missing slots with no hardcoded constants --- docs/introduction/howtorun.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/introduction/howtorun.rst b/docs/introduction/howtorun.rst index 4f2a3caa7653..6ec1b74e0044 100644 --- a/docs/introduction/howtorun.rst +++ b/docs/introduction/howtorun.rst @@ -105,9 +105,8 @@ When a delegator spends their tokens, the delegated balance of their delegate de If a delegate runs out of funds to deposit it won't be able to bake or endorse. Other than being a missed opportunity for them, this has also negative consequences on the network. -Missing baking slots slows the network, as it is necessary to wait for one -minute for the baker at priority 2 to bake, while missing endorsements -reduce the fitness of the chain, making it more susceptible to forks. +Missing baking or endorsing slots slows down the network, as it is necessary to wait some time for the baker at the next priority to bake, and also some other time for each missed endorsing slot. +Besides, missed endorsements also makes the chain more susceptible to forks. Running out of funds can happen if a delegate is *over-delegated*, that is if the amount of rolls it was delegate is disproportionate with respect to its available funds. -- GitLab From 2e36220e07dd59c29ecd4154e3ae9ab8dfd83b98 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Tue, 6 Jul 2021 21:06:34 +0200 Subject: [PATCH 03/14] doc: improve structure of sections in test_networks.rst --- docs/introduction/test_networks.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/introduction/test_networks.rst b/docs/introduction/test_networks.rst index 775818c8afcd..c1d599d5429e 100644 --- a/docs/introduction/test_networks.rst +++ b/docs/introduction/test_networks.rst @@ -2,6 +2,7 @@ .. _test-networks: +============= Test Networks ============= @@ -23,7 +24,7 @@ a new test network is spawned. This also makes synchronization much faster than with a long-lived network. Get Free Funds --------------- +============== Test networks have a list of built-in accounts with some funds. You can obtain the key to these accounts from a faucet to claim the funds. @@ -31,7 +32,7 @@ All networks share the same faucet: https://faucet.tzalpha.net/. The keys obtained from this faucet can be used in all test networks. Granadanet ----------- +========== - Built-in network alias: ``granadanet`` (see :ref:`builtin_networks`) @@ -57,7 +58,7 @@ This results in a faster chain than Mainnet: - a voting period lasts half a cycle and should thus last about 8 hours. Florencenet ------------ +=========== - Built-in network alias: ``florencenet`` (see :ref:`builtin_networks`) @@ -84,7 +85,7 @@ This results in a faster chain than Mainnet: - a voting period lasts half a cycle and should thus last about 8 hours. Future Networks ---------------- +=============== At some point, there will be a proposal for a successor to the current protocol (let's call this new protocol P). After P is injected, a new test network -- GitLab From 035895b6a25f25927f989fa05d3ff9015554388d Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Tue, 6 Jul 2021 21:27:33 +0200 Subject: [PATCH 04/14] doc: link to section on tezos-admin-client in howtouse.rst --- docs/introduction/howtouse.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/introduction/howtouse.rst b/docs/introduction/howtouse.rst index 5ddc1f715d72..ed0308c54114 100644 --- a/docs/introduction/howtouse.rst +++ b/docs/introduction/howtouse.rst @@ -17,7 +17,7 @@ After a successful compilation, you should have the following binaries: - ``tezos-node``: the tezos daemon itself (see `Node`_); - ``tezos-client``: a command-line client and basic wallet (see `Client`_); -- ``tezos-admin-client``: administration tool for the node; +- ``tezos-admin-client``: administration tool for the node (see :ref:`tezos-admin-client`); - ``tezos-{baker,endorser,accuser}-*``: daemons to bake, endorse and accuse on the Tezos network (see :doc:`howtorun`); - ``tezos-validator``: a daemon for validating and applying operations in blocks (see `Validator`_) -- GitLab From aa16533d315fc0b1cea7a88482ecffeac9cb4296 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Wed, 7 Jul 2021 15:36:54 +0200 Subject: [PATCH 05/14] doc: remove mentions of Alpha in 009/glossary.rst --- docs/009/glossary.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/009/glossary.rst b/docs/009/glossary.rst index df1e907acc1f..7a62950f1dbe 100644 --- a/docs/009/glossary.rst +++ b/docs/009/glossary.rst @@ -10,8 +10,8 @@ Tezos .. include:: ../shell/glossary.rst.h -Protocol Alpha --------------- +Protocol +-------- _`Accuser` When a node_ attempts to inject several incompatible blocks (or when it tries @@ -25,7 +25,7 @@ _`Accuser` separate binary. _`Account` - An account is a unique identifier within protocol Alpha. There are different + An account is a unique identifier within the protocol. There are different kinds of accounts (see `Originated account`_ and `Implicit account`_). In the Context_, each account is associated with a balance (an amount of @@ -118,7 +118,7 @@ Michelson The built-in language used by a `smart contract`_. _`Operations` - In protocol Alpha, the main operations are transactions (to transfer funds + The main operations in the protocol are transactions (to transfer funds or to execute smart contracts), accusations, activations, delegations, endorsements and originations. -- GitLab From 5149d1fe75506611ce7bc18e34f7d450b85fda2d Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Fri, 9 Jul 2021 10:00:33 +0200 Subject: [PATCH 06/14] doc: replace policy by rule (was used only once) --- docs/user/node-configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/node-configuration.rst b/docs/user/node-configuration.rst index 08fb67fb3c11..d1242eb57eac 100644 --- a/docs/user/node-configuration.rst +++ b/docs/user/node-configuration.rst @@ -128,7 +128,7 @@ with other characters in a path segment). A ``**`` stands for any possible path suffix. .. warning:: - The policy is always searched from the beginning of the list to the end and + Rules are always searched from the beginning of the list to the end and the first matching address is returned. Therefore if one wants to put one rule on a specific port on a given host and another rule for all other ports on the same host, then more specific rules should always be written *first* -- GitLab From 8ef8685af988f59cae82df609f086a606a03e342 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Fri, 9 Jul 2021 11:13:44 +0200 Subject: [PATCH 07/14] doc: typos on RPC ACLs --- docs/developer/guidelines.rst | 2 +- docs/user/node-configuration.rst | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/developer/guidelines.rst b/docs/developer/guidelines.rst index ea89add050e7..42acbe86c9b0 100644 --- a/docs/developer/guidelines.rst +++ b/docs/developer/guidelines.rst @@ -331,7 +331,7 @@ configuration or debugging purposes or to facilitate development of smart contracts. In order to mitigate risks related to exposing these endpoints, Access Control -Lists (ACL for short) were introduced to limit the scope of API exposed to +Lists (ACL for short) were introduced to limit the scope of the API exposed to public networks (see also :ref:`configure_rpc`). While node administrators are free to configure these ACLs however they like, there is the default ACL hard-coded in ``src/lib_rpc_http/RPC_server.ml``, which lists all the endpoints diff --git a/docs/user/node-configuration.rst b/docs/user/node-configuration.rst index d1242eb57eac..132fb7602b74 100644 --- a/docs/user/node-configuration.rst +++ b/docs/user/node-configuration.rst @@ -140,9 +140,10 @@ Default ACL for RPC ------------------- The default ACL for RPC depends on the listening address that the node is using. + If the listening address resolves to the loopback network interface, then full -access to all endpoints is granted. Note, that it does not matter, from which -machine the client is really making his request, but only what the listening +access to all endpoints is granted. Note that it does not matter from which +machine the client is really making a request, but only what the listening address is. This guarantees that insecure endpoints can only be accessed from ``localhost``. -- GitLab From eccef0a2595fca54efed2b4cd15d831c993860b0 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Fri, 9 Jul 2021 11:15:01 +0200 Subject: [PATCH 08/14] doc: add RPC security to contributing checklist --- docs/developer/contributing.rst | 2 ++ docs/developer/guidelines.rst | 2 ++ 2 files changed, 4 insertions(+) diff --git a/docs/developer/contributing.rst b/docs/developer/contributing.rst index 74dd7c33f6bb..230e96b14635 100644 --- a/docs/developer/contributing.rst +++ b/docs/developer/contributing.rst @@ -174,6 +174,8 @@ While working on your branch to prepare a Merge Request, make sure you respect t - If you add new functions to an interface, don’t forget to document the function in the interface (in the corresponding .mli file; or, if there is no .mli file, directly in the .ml file) +- If you add a new RPC endpoint or modify an existing one, be sure to take + into account the impact on :ref:`RPC security `. - If you modify the user API (e.g. add or change a configuration parameter or a command-line option), update the corresponding documentation. In particular, for configuration parameters of the Tezos node, update the node diff --git a/docs/developer/guidelines.rst b/docs/developer/guidelines.rst index 42acbe86c9b0..5614db69e0af 100644 --- a/docs/developer/guidelines.rst +++ b/docs/developer/guidelines.rst @@ -319,6 +319,8 @@ The ``Lwtreslib`` and the ``Error_monad`` libraries provide functions that can help you follow these guidelines. Notably, ``traces`` allow callers to contextualise the errors produced by its callees. +.. _rpc_security: + RPC security ------------ -- GitLab From 6b353d74e5b2b9c216b4d766e3c978a2cd7198b5 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Fri, 9 Jul 2021 11:20:51 +0200 Subject: [PATCH 09/14] doc: fix broken ref to src file tezos_node/tezos-node.ml --- docs/user/node-configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/node-configuration.rst b/docs/user/node-configuration.rst index 132fb7602b74..31846da01562 100644 --- a/docs/user/node-configuration.rst +++ b/docs/user/node-configuration.rst @@ -166,7 +166,7 @@ actually listening on): .. literalinclude:: default-acl.json The endpoints specifically required for baking can be found in -``vendors/flextesa-lib/tezos-node.ml``. +:src:`vendors/flextesa-lib/tezos_node.ml`. .. _configure_p2p: -- GitLab From ebf9ce356d9d693f414031ed5fb4411bdd449b26 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Fri, 9 Jul 2021 11:25:59 +0200 Subject: [PATCH 10/14] doc: factorize default ACLs btw node-config & guidelines --- docs/developer/guidelines.rst | 5 ++--- docs/user/node-configuration.rst | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/developer/guidelines.rst b/docs/developer/guidelines.rst index 5614db69e0af..23b6742ade64 100644 --- a/docs/developer/guidelines.rst +++ b/docs/developer/guidelines.rst @@ -335,9 +335,8 @@ contracts. In order to mitigate risks related to exposing these endpoints, Access Control Lists (ACL for short) were introduced to limit the scope of the API exposed to public networks (see also :ref:`configure_rpc`). While node administrators are -free to configure these ACLs however they like, there is the default ACL -hard-coded in ``src/lib_rpc_http/RPC_server.ml``, which lists all the endpoints -that are **exposed by default**. +free to configure these ACLs however they like, there is :ref:`the default ACL +`, which lists all the endpoints that are **exposed by default**. When adding a new RPC endpoint, please consider whether or not there is a reason to call it over a public network. If the answer is yes, you should probably diff --git a/docs/user/node-configuration.rst b/docs/user/node-configuration.rst index 31846da01562..78da0ad2ae88 100644 --- a/docs/user/node-configuration.rst +++ b/docs/user/node-configuration.rst @@ -159,7 +159,8 @@ relaxed or tightened by modifying the configuration file. It's worth noting that this default policy among other things disallows baking and endorsing by bakers and endorsers running on remote servers. -This is the default ACL policy for the node (remember to replace +The following is the default ACL policy for the node, +hard-coded in :src:`src/lib_rpc_http/RPC_server.ml` (remember to replace ``any.public.address`` with an IP address or a domain name that you'll be actually listening on): -- GitLab From 605a832ec86e4d1fe85f6b6306af59bd711262e4 Mon Sep 17 00:00:00 2001 From: Eugen Zalinescu Date: Tue, 13 Jul 2021 15:05:09 +0200 Subject: [PATCH 11/14] doc: remove use of incorrect reward formulas the previously mentioned rewards were correct for Athens, but not for subsequent protocols --- docs/introduction/howtorun.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/introduction/howtorun.rst b/docs/introduction/howtorun.rst index 6ec1b74e0044..8d1c09eda059 100644 --- a/docs/introduction/howtorun.rst +++ b/docs/introduction/howtorun.rst @@ -192,9 +192,7 @@ won't miss any opportunity we should have around ~3kꜩ for deposits, on the other hand, the expected returns will probably be around ~10ꜩ per cycle. After ``preserved_cycles``, not only does the delegate take back control of -its frozen deposits, but it also receives the rewards for its hard work -which amount to 16ꜩ to bake a block and ``2ꜩ / `` for -endorsing a block. +its frozen deposits, but it also receives its rewards for baking and endorsing. Additionally, a baker also receives the fees of the operations it included in its blocks. While fees are unfrozen after ``preserved_cycles`` like deposits and -- GitLab From 865d9b494be38c1b62ad224da38a8f28ff7edc17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 14 Jul 2021 12:09:17 +0200 Subject: [PATCH 12/14] Doc: fix typo reported in issue #660 --- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- .../lib_client_commands/client_proto_context_commands.ml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/proto_001_PtCJ7pwo/lib_client_commands/client_proto_context_commands.ml b/src/proto_001_PtCJ7pwo/lib_client_commands/client_proto_context_commands.ml index abc9b7b6b159..3abbd9bc3fff 100644 --- a/src/proto_001_PtCJ7pwo/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_001_PtCJ7pwo/lib_client_commands/client_proto_context_commands.ml @@ -186,7 +186,7 @@ let commands () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Alpha_client_context.full) -> diff --git a/src/proto_002_PsYLVpVv/lib_client_commands/client_proto_context_commands.ml b/src/proto_002_PsYLVpVv/lib_client_commands/client_proto_context_commands.ml index e7ac3984957a..ab40a32d9d26 100644 --- a/src/proto_002_PsYLVpVv/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_002_PsYLVpVv/lib_client_commands/client_proto_context_commands.ml @@ -249,7 +249,7 @@ let commands () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Alpha_client_context.full) -> diff --git a/src/proto_003_PsddFKi3/lib_client_commands/client_proto_context_commands.ml b/src/proto_003_PsddFKi3/lib_client_commands/client_proto_context_commands.ml index 62ff2c4c08f0..60416b4beb21 100644 --- a/src/proto_003_PsddFKi3/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_003_PsddFKi3/lib_client_commands/client_proto_context_commands.ml @@ -255,7 +255,7 @@ let commands () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Alpha_client_context.full) -> diff --git a/src/proto_004_Pt24m4xi/lib_client_commands/client_proto_context_commands.ml b/src/proto_004_Pt24m4xi/lib_client_commands/client_proto_context_commands.ml index 62ff2c4c08f0..60416b4beb21 100644 --- a/src/proto_004_Pt24m4xi/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_004_Pt24m4xi/lib_client_commands/client_proto_context_commands.ml @@ -255,7 +255,7 @@ let commands () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Alpha_client_context.full) -> diff --git a/src/proto_005_PsBabyM1/lib_client_commands/client_proto_context_commands.ml b/src/proto_005_PsBabyM1/lib_client_commands/client_proto_context_commands.ml index 9d612cfe9748..f83ca0ebc010 100644 --- a/src/proto_005_PsBabyM1/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_005_PsBabyM1/lib_client_commands/client_proto_context_commands.ml @@ -319,7 +319,7 @@ let commands () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Protocol_client_context.full) -> diff --git a/src/proto_006_PsCARTHA/lib_client_commands/client_proto_context_commands.ml b/src/proto_006_PsCARTHA/lib_client_commands/client_proto_context_commands.ml index cf469d8cfff0..fdd8324f2bc9 100644 --- a/src/proto_006_PsCARTHA/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_006_PsCARTHA/lib_client_commands/client_proto_context_commands.ml @@ -1079,7 +1079,7 @@ let commands network () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Protocol_client_context.full) -> diff --git a/src/proto_008_PtEdo2Zk/lib_client_commands/client_proto_context_commands.ml b/src/proto_008_PtEdo2Zk/lib_client_commands/client_proto_context_commands.ml index 4fa86059eb7f..467fb57759fa 100644 --- a/src/proto_008_PtEdo2Zk/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_008_PtEdo2Zk/lib_client_commands/client_proto_context_commands.ml @@ -1334,7 +1334,7 @@ let commands network () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Protocol_client_context.full) -> diff --git a/src/proto_009_PsFLoren/lib_client_commands/client_proto_context_commands.ml b/src/proto_009_PsFLoren/lib_client_commands/client_proto_context_commands.ml index 9c542fa56469..d8a142d5346f 100644 --- a/src/proto_009_PsFLoren/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_009_PsFLoren/lib_client_commands/client_proto_context_commands.ml @@ -1327,7 +1327,7 @@ let commands network () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Protocol_client_context.full) -> diff --git a/src/proto_010_PtGRANAD/lib_client_commands/client_proto_context_commands.ml b/src/proto_010_PtGRANAD/lib_client_commands/client_proto_context_commands.ml index 0448215ad5da..dbb22bf08f5d 100644 --- a/src/proto_010_PtGRANAD/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_010_PtGRANAD/lib_client_commands/client_proto_context_commands.ml @@ -1321,7 +1321,7 @@ let commands network () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Protocol_client_context.full) -> diff --git a/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml b/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml index 9b9bd1db56cf..6dcf0acd7f88 100644 --- a/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml +++ b/src/proto_alpha/lib_client_commands/client_proto_context_commands.ml @@ -1315,7 +1315,7 @@ let commands network () = >>= fun () -> return_unit); command ~group:binary_description - ~desc:"Describe unsigned block header" + ~desc:"Describe unsigned operation" no_options (fixed ["describe"; "unsigned"; "operation"]) (fun () (cctxt : Protocol_client_context.full) -> -- GitLab From 1c73165b4e40f50e247afec809718b173731faaa Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Thu, 15 Jul 2021 11:48:33 +0200 Subject: [PATCH 13/14] doc: mention importance of an accurate time source in howtorun.rst --- docs/introduction/howtorun.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/introduction/howtorun.rst b/docs/introduction/howtorun.rst index 8d1c09eda059..9d4692065b06 100644 --- a/docs/introduction/howtorun.rst +++ b/docs/introduction/howtorun.rst @@ -12,6 +12,9 @@ The second way allows to participate more actively in the protocol, by baking bl To learn more about the protocol refer to :doc:`this page <../active/proof_of_stake>`. +No matter how you decide to run Tezos, your node must have an accurate time source and be properly synchronized to it, e.g. by configuring an NTP daemon. +This is especially important for bakers, as baking nodes desynchronized from the correct time of day have caused operational problems in the past by "baking in the future". + .. _delegating_coins: Delegating your coins -- GitLab From c7ac6a63e4603d73a6a266286707b24f57d80654 Mon Sep 17 00:00:00 2001 From: Nic Volanschi Date: Mon, 19 Jul 2021 11:07:22 +0200 Subject: [PATCH 14/14] doc: unflatten sections structure in protocol_environment.rst --- docs/developer/protocol_environment.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer/protocol_environment.rst b/docs/developer/protocol_environment.rst index f986f1ff91c9..5597879b5d2f 100644 --- a/docs/developer/protocol_environment.rst +++ b/docs/developer/protocol_environment.rst @@ -45,7 +45,7 @@ Here is a quick description of each file in this environment, all located under Environment versions -==================== +-------------------- The environment interfaces are frozen, providing forever an immutable interface to the protocol. And so when a protocol needs new functions, types, or values, -- GitLab