chaintool-doc

Chaintool documentation
Info | Log | Files | Refs | README | LICENSE

README.md (23611B)


      1 # Chaintool documentation
      2 
      3 Chaintool is still very much a work-in-progress. So too is its documentation.
      4 
      5 This README, while still somewhat chaotic, aims to fill the void of a missing structured presentation, and make the introduction to chaintool a bit more friendly.
      6 
      7 
      8 ## Showcasing chaintool
      9 
     10 The most intuitive entry point to chaintool is most likely the `eth-monitor` tool. It can be installed directly from `pypi` using `pip install eth-monitor`.
     11 
     12 <video width="800" height="450" controls>
     13 <source src="https://defalsify.org/chaintool_pychain_pitch.mp4">
     14 Your browser cannot embed this video. Please use the links below instead.
     15 </video>
     16 
     17 Source:
     18 
     19 * [video file](https://defalsify.org/chaintool_pychain_pitch.mp4)
     20 * [video file signatures](https://defalsify.org/chaintool_pychain_pitch.mp4.asc)
     21 
     22 ## Code components
     23 
     24 Upstream souce of chaintool code is located at [git.defalsify.org](https://git.defalsify.org)
     25 
     26 
     27 ### Core layer
     28 
     29 All libraries that are considered part of the `chaintool` suite:
     30 
     31 * **funga**, **funga-eth** - message signing tools and daemon for development, with implementation for EVM.
     32 * **chainlib**, **chainlib-eth** - blockchain RPC interface with tooling and implementation for EVM nodes.
     33 * **chainsyncer** - blockchain RPC transaction sync driver.
     34 * **chainqueue** - blockchain RPC transaction queue control.
     35 * **eth-cache** - transparent proxy that stores local copies of RPC results.
     36 
     37 
     38 ### Higher layer
     39 
     40 Tools and daemons building on the core layer.
     41 
     42 * **eth-monitor** - Visualization and arbitrary code execution for mined transactions
     43 * **chaind**, **chaind-eth** - Full-duplex transaction queueing tool for ethereum
     44 
     45 
     46 ### Lower layer
     47 
     48 Libraries that were developed within the context of `chaintool`, but have a more generic scope.
     49 
     50 * **shep** - Multi-state key/value stores using bit masks.
     51 * **confini** - Parse and merge multiple ini files.
     52 * **aiee** - Common command line interfacing utils.
     53 * **leveldir** - Multi-level directory structure data stores.
     54 * **hexathon** - Common and uncommon hex string operations.
     55 * **potaahto** - Essentially: Convert between snake and camel case.
     56 
     57 The upstream code of these lower layer modules can be found at [holbrook.no/src](https://holbrook.no/src)
     58 
     59 
     60 ## Documentation for chaintool
     61 
     62 
     63 So far, documentation efforts have been made in four areas, in order of most recently updated first:
     64 
     65 
     66 ### Code components diagram
     67 
     68 Last time the author remembered to render it, it looked like this:
     69 
     70 <img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDExLjAuMCAoMCkKIC0tPgo8IS0tIFBhZ2VzOiAxIC0tPgo8c3ZnIHdpZHRoPSI2NTNwdCIgaGVpZ2h0PSI1NDhwdCIKIHZpZXdCb3g9IjAuMDAgMC4wMCA2NTIuODUgNTQ4LjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDU0NCkiPgo8cG9seWdvbiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSJub25lIiBwb2ludHM9Ii00LDQgLTQsLTU0NCA2NDguODUsLTU0NCA2NDguODUsNCAtNCw0Ii8+CjwhLS0gY29uZmluaSAtLT4KPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jb25maW5pPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2NjY2NjYyIgc3Ryb2tlPSJibGFjayIgY3g9IjEzNS40OSIgY3k9Ii00NTAiIHJ4PSI0Ni43NSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEzNS40OSIgeT0iLTQ0NC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5sby9jb25maW5pPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWIgLS0+CjxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+Y2hhaW5saWI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBjeD0iMjEwLjQ5IiBjeT0iLTM3OCIgcng9IjQwLjYiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTAuNDkiIHk9Ii0zNzIuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Y2hhaW5saWI8L3RleHQ+CjwvZz4KPCEtLSBjb25maW5pJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y29uZmluaSYjNDU7Jmd0O2NoYWlubGliPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTE1Mi41LC00MzMuMTJDMTYyLjE5LC00MjQuMDggMTc0LjUsLTQxMi41OCAxODUuMjksLTQwMi41MiIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxODcuNTEsLTQwNS4yNCAxOTIuNDMsLTM5NS44NSAxODIuNzMsLTQwMC4xMiAxODcuNTEsLTQwNS4yNCIvPgo8L2c+CjwhLS0gaGV4YXRob24gLS0+CjxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+aGV4YXRob248L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjY2NjY2NjIiBzdHJva2U9ImJsYWNrIiBjeD0iMzkyLjQ5IiBjeT0iLTUyMiIgcng9IjU0LjQyIiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzkyLjQ5IiB5PSItNTE2Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2hleGF0aG9uPC90ZXh0Pgo8L2c+CjwhLS0gbGV2ZWxkaXIgLS0+CjxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+bGV2ZWxkaXI8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjY2NjY2NjIiBzdHJva2U9ImJsYWNrIiBjeD0iMjg3LjQ5IiBjeT0iLTMwNiIgcng9IjQ4Ljc5IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg3LjQ5IiB5PSItMzAwLjk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2xldmVsZGlyPC90ZXh0Pgo8L2c+CjwhLS0gaGV4YXRob24mIzQ1OyZndDtsZXZlbGRpciAtLT4KPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5oZXhhdGhvbiYjNDU7Jmd0O2xldmVsZGlyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQwOS4yOCwtNTA0LjQyQzQxOC4wNiwtNDk0LjY4IDQyOC4wOCwtNDgxLjYyIDQzMy40OSwtNDY4IDQ1MS4yMiwtNDIzLjI5IDQ2OC4zOCwtMzk5LjE5IDQ0MC40OSwtMzYwIDQzNy4yMywtMzU1LjQyIDM3OC4zMSwtMzM1Ljg4IDMzNC41NiwtMzIxLjg1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMzNS44NCwtMzE4LjU5IDMyNS4yNSwtMzE4Ljg4IDMzMy43MSwtMzI1LjI1IDMzNS44NCwtMzE4LjU5Ii8+CjwvZz4KPCEtLSBoZXhhdGhvbiYjNDU7Jmd0O2NoYWlubGliIC0tPgo8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmhleGF0aG9uJiM0NTsmZ3Q7Y2hhaW5saWI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzM5LjU5LC01MTcuMjhDMzAzLjUxLC01MTEuOSAyNTcuMzcsLTQ5OC45NSAyMjkuNDksLTQ2OCAyMTQuODQsLTQ1MS43NSAyMTAuNDgsLTQyNy4wNCAyMDkuNTYsLTQwNy43OCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyMTMuMDYsLTQwNy43OSAyMDkuNCwtMzk3Ljg0IDIwNi4wNiwtNDA3LjkgMjEzLjA2LC00MDcuNzkiLz4KPC9nPgo8IS0tIGZ1bmdhIC0tPgo8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmZ1bmdhPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM5Mi40OSIgY3k9Ii00NTAiIHJ4PSIzMS45IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzkyLjQ5IiB5PSItNDQ0Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmZ1bmdhPC90ZXh0Pgo8L2c+CjwhLS0gaGV4YXRob24mIzQ1OyZndDtmdW5nYSAtLT4KPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5oZXhhdGhvbiYjNDU7Jmd0O2Z1bmdhPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM5Mi40OSwtNTAzLjdDMzkyLjQ5LC00OTYuNDEgMzkyLjQ5LC00ODcuNzMgMzkyLjQ5LC00NzkuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMzk1Ljk5LC00NzkuNjIgMzkyLjQ5LC00NjkuNjIgMzg4Ljk5LC00NzkuNjIgMzk1Ljk5LC00NzkuNjIiLz4KPC9nPgo8IS0tIHBvdGFhaHRvIC0tPgo8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KPHRpdGxlPnBvdGFhaHRvPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2NjY2NjYyIgc3Ryb2tlPSJibGFjayIgY3g9IjI5MC40OSIgY3k9Ii00NTAiIHJ4PSI1Mi4zOCIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI5MC40OSIgeT0iLTQ0NC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5sby9wb3RhYWh0bzwvdGV4dD4KPC9nPgo8IS0tIHBvdGFhaHRvJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+cG90YWFodG8mIzQ1OyZndDtjaGFpbmxpYjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0yNzEuOTMsLTQzMi43NkMyNjEuNDEsLTQyMy41NiAyNDguMDgsLTQxMS45IDIzNi41MywtNDAxLjc5Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjIzOS4wOSwtMzk5LjM3IDIyOS4yNiwtMzk1LjQyIDIzNC40OCwtNDA0LjY0IDIzOS4wOSwtMzk5LjM3Ii8+CjwvZz4KPCEtLSBldGhfY2FjaGUgLS0+CjxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmV0aF9jYWNoZTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyODQuNDkiIGN5PSItMjM0IiByeD0iNDYuMjMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODQuNDkiIHk9Ii0yMjguOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+ZXRoJiM0NTtjYWNoZTwvdGV4dD4KPC9nPgo8IS0tIGxldmVsZGlyJiM0NTsmZ3Q7ZXRoX2NhY2hlIC0tPgo8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmxldmVsZGlyJiM0NTsmZ3Q7ZXRoX2NhY2hlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI4Ni43NCwtMjg3LjdDMjg2LjQzLC0yODAuNDEgMjg2LjA2LC0yNzEuNzMgMjg1LjcxLC0yNjMuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjg5LjIxLC0yNjMuNDYgMjg1LjI4LC0yNTMuNjIgMjgyLjIxLC0yNjMuNzYgMjg5LjIxLC0yNjMuNDYiLz4KPC9nPgo8IS0tIHNoZXAgLS0+CjxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+c2hlcDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IiNjY2NjY2MiIHN0cm9rZT0iYmxhY2siIGN4PSIxNDQuNDkiIGN5PSItMjM0IiByeD0iMzcuNTMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDQuNDkiIHk9Ii0yMjguOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+bG8vc2hlcDwvdGV4dD4KPC9nPgo8IS0tIGNoYWluc3luY2VyIC0tPgo8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jaGFpbnN5bmNlcjwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSIyNzcuNDkiIGN5PSItMTYyIiByeD0iNTQuOTMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzcuNDkiIHk9Ii0xNTYuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Y2hhaW5zeW5jZXI8L3RleHQ+CjwvZz4KPCEtLSBzaGVwJiM0NTsmZ3Q7Y2hhaW5zeW5jZXIgLS0+CjxnIGlkPSJlZGdlMTQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPnNoZXAmIzQ1OyZndDtjaGFpbnN5bmNlcjwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xNjkuMTksLTIyMEMxODguODYsLTIwOS42NCAyMTYuNzUsLTE5NC45NyAyMzkuMjksLTE4My4xIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjI0MC42NywtMTg2LjMzIDI0Ny44OSwtMTc4LjU4IDIzNy40MSwtMTgwLjE0IDI0MC42NywtMTg2LjMzIi8+CjwvZz4KPCEtLSBjaGFpbnF1ZXVlIC0tPgo8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+Cjx0aXRsZT5jaGFpbnF1ZXVlPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjE0NC40OSIgY3k9Ii0xNjIiIHJ4PSI1Mi44OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE0NC40OSIgeT0iLTE1Ni45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5jaGFpbnF1ZXVlPC90ZXh0Pgo8L2c+CjwhLS0gc2hlcCYjNDU7Jmd0O2NoYWlucXVldWUgLS0+CjxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPnNoZXAmIzQ1OyZndDtjaGFpbnF1ZXVlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTE0NC40OSwtMjE1LjdDMTQ0LjQ5LC0yMDguNDEgMTQ0LjQ5LC0xOTkuNzMgMTQ0LjQ5LC0xOTEuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTQ3Ljk5LC0xOTEuNjIgMTQ0LjQ5LC0xODEuNjIgMTQwLjk5LC0xOTEuNjIgMTQ3Ljk5LC0xOTEuNjIiLz4KPC9nPgo8IS0tIGFpZWUgLS0+CjxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+YWllZTwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9IiNjY2NjY2MiIHN0cm9rZT0iYmxhY2siIGN4PSIzNS40OSIgY3k9Ii00NTAiIHJ4PSIzNS40OSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1LjQ5IiB5PSItNDQ0Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmxvL2FsZWU8L3RleHQ+CjwvZz4KPCEtLSBhaWVlJiM0NTsmZ3Q7Y2hhaW5saWIgLS0+CjxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+YWllZSYjNDU7Jmd0O2NoYWlubGliPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTYyLjgzLC00MzguMDZDOTEuNjgsLTQyNi41MiAxMzcuNDMsLTQwOC4yMiAxNzAuMzYsLTM5NS4wNSIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIxNzEuNjEsLTM5OC4zMiAxNzkuNTksLTM5MS4zNiAxNjkuMDEsLTM5MS44MiAxNzEuNjEsLTM5OC4zMiIvPgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoIC0tPgo8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmNoYWlubGliX2V0aDwvdGl0bGU+CjxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGN4PSI0MDkuNDkiIGN5PSItMzA2IiByeD0iNTQuOTMiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDkuNDkiIHk9Ii0zMDAuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+Y2hhaW5saWImIzQ1O2V0aDwvdGV4dD4KPC9nPgo8IS0tIGNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5saWJfZXRoIC0tPgo8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5saWJfZXRoPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI0MS41OCwtMzY2LjA2QzI3My45MSwtMzU0LjY5IDMyNC45MywtMzM2Ljc0IDM2Mi4yNSwtMzIzLjYyIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjM2My4xNywtMzI3IDM3MS40NCwtMzIwLjM4IDM2MC44NSwtMzIwLjQgMzYzLjE3LC0zMjciLz4KPC9nPgo8IS0tIGNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5zeW5jZXIgLS0+CjxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5zeW5jZXI8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMjA5LjE4LC0zNTkuNjRDMjA3LjYxLC0zMjkuMSAyMDcuNDcsLTI2NC40MyAyMjkuNDksLTIxNiAyMzQuMjksLTIwNS40MyAyNDEuOTksLTE5NS41MSAyNDkuODMsLTE4Ny4xOCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIyNTIuMjQsLTE4OS43MSAyNTYuODYsLTE4MC4xNyAyNDcuMywtMTg0Ljc1IDI1Mi4yNCwtMTg5LjcxIi8+CjwvZz4KPCEtLSBjaGFpbmxpYiYjNDU7Jmd0O2NoYWlucXVldWUgLS0+CjxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliJiM0NTsmZ3Q7Y2hhaW5xdWV1ZTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik0xODkuNywtMzYyLjA5QzE2Mi40NiwtMzQxLjExIDExNS45OCwtMzAwLjA1IDk3LjQ5LC0yNTIgOTEuNzQsLTIzNy4wNyA5MS44MSwtMjMwLjk2IDk3LjQ5LC0yMTYgMTAxLjU3LC0yMDUuMjUgMTA4Ljk0LC0xOTUuMjggMTE2LjY1LC0xODYuOTYiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMTE5LjAyLC0xODkuNTMgMTIzLjYyLC0xNzkuOTggMTE0LjA3LC0xODQuNTggMTE5LjAyLC0xODkuNTMiLz4KPC9nPgo8IS0tIGNoYWlubGliX2V0aCYjNDU7Jmd0O2V0aF9jYWNoZSAtLT4KPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2NhY2hlPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM4Mi42NywtMjg5Ljk4QzM2NC4zNCwtMjc5LjcyIDMzOS44NiwtMjY2LjAxIDMxOS45MywtMjU0Ljg1Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjMyMS43MywtMjUxLjg1IDMxMS4zLC0yNTAuMDEgMzE4LjMxLC0yNTcuOTUgMzIxLjczLC0yNTEuODUiLz4KPC9nPgo8IS0tIGNoYWluZF9ldGggLS0+CjxnIGlkPSJub2RlMTUiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmNoYWluZF9ldGg8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjYWFmZmFhIiBzdHJva2U9ImJsYWNrIiBjeD0iNDczLjQ5IiBjeT0iLTE4IiByeD0iNTkuNTQiIHJ5PSIxOCIvPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NzMuNDkiIHk9Ii0xMi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9jaGFpbmQmIzQ1O2V0aDwvdGV4dD4KPC9nPgo8IS0tIGNoYWlubGliX2V0aCYjNDU7Jmd0O2NoYWluZF9ldGggLS0+CjxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliX2V0aCYjNDU7Jmd0O2NoYWluZF9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDYxLjE4LC0yOTkuNTNDNTE4LjIsLTI5Mi4zIDYwNC41NywtMjc3LjQyIDYyNC40OSwtMjUyIDY3Ny4wMywtMTg0LjkyIDYxNi4xOSwtMTM0LjY5IDU1OC40OSwtNzIgNTQ2LjQzLC01OC45IDUzMC40MiwtNDcuOCA1MTUuNTUsLTM5LjIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTE3LjI3LC0zNi4xNSA1MDYuODMsLTM0LjM4IDUxMy44OSwtNDIuMjggNTE3LjI3LC0zNi4xNSIvPgo8L2c+CjwhLS0gZXRoX21vbml0b3IgLS0+CjxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmV0aF9tb25pdG9yPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2FhZmZhYSIgc3Ryb2tlPSJibGFjayIgY3g9IjQ4NC40OSIgY3k9Ii05MCIgcng9IjY0LjY2IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDg0LjQ5IiB5PSItODQuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+aGkvZXRoJiM0NTttb25pdG9yPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX21vbml0b3IgLS0+CjxnIGlkPSJlZGdlMjQiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlubGliX2V0aCYjNDU7Jmd0O2V0aF9tb25pdG9yPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTQ1OS45NSwtMjk4LjM1QzUxMS45NiwtMjkwLjM0IDU4Ny44NiwtMjc1LjAyIDYwNS40OSwtMjUyIDY0My40NiwtMjAyLjM5IDU2OS40NywtMTQzLjU5IDUyMS4zMiwtMTEyLjYxIi8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjUyMy4zOSwtMTA5Ljc4IDUxMy4wNiwtMTA3LjQyIDUxOS42NiwtMTE1LjcgNTIzLjM5LC0xMDkuNzgiLz4KPC9nPgo8IS0tIGV0aF9lcmMyMCAtLT4KPGcgaWQ9Im5vZGUxNyIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZXRoX2VyYzIwPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2FhZmZhYSIgc3Ryb2tlPSJibGFjayIgY3g9IjU0MS40OSIgY3k9Ii0yMzQiIHJ4PSI1NS40NSIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU0MS40OSIgeT0iLTIyOC45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5oaS9ldGgmIzQ1O2VyYzIwPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2VyYzIwIC0tPgo8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5jaGFpbmxpYl9ldGgmIzQ1OyZndDtldGhfZXJjMjA8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNNDM3LjQ4LC0yOTAuMTVDNDU2LjczLC0yNzkuOTUgNDgyLjUyLC0yNjYuMjcgNTAzLjYxLC0yNTUuMDkiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNTA1LC0yNTguMzEgNTEyLjE5LC0yNTAuNTMgNTAxLjcyLC0yNTIuMTMgNTA1LC0yNTguMzEiLz4KPC9nPgo8IS0tIGV0aF9lcmM3MjEgLS0+CjxnIGlkPSJub2RlMTgiIGNsYXNzPSJub2RlIj4KPHRpdGxlPmV0aF9lcmM3MjE8L3RpdGxlPgo8ZWxsaXBzZSBmaWxsPSIjYWFmZmFhIiBzdHJva2U9ImJsYWNrIiBjeD0iNDA4LjQ5IiBjeT0iLTIzNCIgcng9IjYwLjA1IiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDA4LjQ5IiB5PSItMjI4Ljk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiPmhpL2V0aCYjNDU7ZXJjNzIxPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2VyYzcyMSAtLT4KPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+Y2hhaW5saWJfZXRoJiM0NTsmZ3Q7ZXRoX2VyYzcyMTwvdGl0bGU+CjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIGQ9Ik00MDkuMjQsLTI4Ny43QzQwOS4xMywtMjgwLjQxIDQwOS4wMSwtMjcxLjczIDQwOC44OSwtMjYzLjU0Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQxMi4zOSwtMjYzLjU3IDQwOC43NSwtMjUzLjYyIDQwNS4zOSwtMjYzLjY3IDQxMi4zOSwtMjYzLjU3Ii8+CjwvZz4KPCEtLSBmdW5nYSYjNDU7Jmd0O2NoYWlubGliIC0tPgo8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5mdW5nYSYjNDU7Jmd0O2NoYWlubGliPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTM2Ny4zOSwtNDM4LjQ0QzM2Mi4xNSwtNDM2LjI4IDM1Ni42NSwtNDM0LjA0IDM1MS40OSwtNDMyIDMxOC4xLC00MTguODEgMjc5Ljk3LC00MDQuNTIgMjUxLjc5LC0zOTQuMTEiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjUzLjE0LC0zOTAuODggMjQyLjU1LC0zOTAuNzEgMjUwLjcyLC0zOTcuNDUgMjUzLjE0LC0zOTAuODgiLz4KPC9nPgo8IS0tIGZ1bmdhX2V0aCAtLT4KPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+ZnVuZ2FfZXRoPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgY3g9IjM4NS40OSIgY3k9Ii0zNzgiIHJ4PSI0Ni4yMyIgcnk9IjE4Ii8+Cjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4NS40OSIgeT0iLTM3Mi45NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIj5mdW5nYSYjNDU7ZXRoPC90ZXh0Pgo8L2c+CjwhLS0gZnVuZ2EmIzQ1OyZndDtmdW5nYV9ldGggLS0+CjxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgo8dGl0bGU+ZnVuZ2EmIzQ1OyZndDtmdW5nYV9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzkwLjc2LC00MzEuN0MzOTAuMDMsLTQyNC40MSAzODkuMTYsLTQxNS43MyAzODguMzQsLTQwNy41NCIvPgo8cG9seWdvbiBmaWxsPSJibGFjayIgc3Ryb2tlPSJibGFjayIgcG9pbnRzPSIzOTEuODIsLTQwNy4yMSAzODcuMzUsLTM5Ny42MSAzODQuODYsLTQwNy45MSAzOTEuODIsLTQwNy4yMSIvPgo8L2c+CjwhLS0gZnVuZ2FfZXRoJiM0NTsmZ3Q7Y2hhaW5saWJfZXRoIC0tPgo8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+Cjx0aXRsZT5mdW5nYV9ldGgmIzQ1OyZndDtjaGFpbmxpYl9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzkxLjQyLC0zNTkuN0MzOTMuOTgsLTM1Mi4yNCAzOTcuMDMsLTM0My4zMiAzOTkuOSwtMzM0Ljk3Ii8+Cjxwb2x5Z29uIGZpbGw9ImJsYWNrIiBzdHJva2U9ImJsYWNrIiBwb2ludHM9IjQwMy4yLC0zMzYuMTMgNDAzLjEzLC0zMjUuNTQgMzk2LjU4LC0zMzMuODYgNDAzLjIsLTMzNi4xMyIvPgo8L2c+CjwhLS0gZXRoX2NhY2hlJiM0NTsmZ3Q7Y2hhaW5zeW5jZXIgLS0+CjxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmV0aF9jYWNoZSYjNDU7Jmd0O2NoYWluc3luY2VyPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI4Mi43NiwtMjE1LjdDMjgyLjAzLC0yMDguNDEgMjgxLjE2LC0xOTkuNzMgMjgwLjM0LC0xOTEuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjgzLjgyLC0xOTEuMjEgMjc5LjM1LC0xODEuNjEgMjc2Ljg2LC0xOTEuOTEgMjgzLjgyLC0xOTEuMjEiLz4KPC9nPgo8IS0tIGNoYWluZCAtLT4KPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgo8dGl0bGU+Y2hhaW5kPC90aXRsZT4KPGVsbGlwc2UgZmlsbD0iI2FhZmZhYSIgc3Ryb2tlPSJibGFjayIgY3g9IjI3Ny40OSIgY3k9Ii05MCIgcng9IjQ1LjIxIiByeT0iMTgiLz4KPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjc3LjQ5IiB5PSItODQuOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCI+aGkvY2hhaW5kPC90ZXh0Pgo8L2c+CjwhLS0gY2hhaW5zeW5jZXImIzQ1OyZndDtjaGFpbmQgLS0+CjxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWluc3luY2VyJiM0NTsmZ3Q7Y2hhaW5kPC90aXRsZT4KPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJibGFjayIgZD0iTTI3Ny40OSwtMTQzLjdDMjc3LjQ5LC0xMzYuNDEgMjc3LjQ5LC0xMjcuNzMgMjc3LjQ5LC0xMTkuNTQiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjgwLjk5LC0xMTkuNjIgMjc3LjQ5LC0xMDkuNjIgMjczLjk5LC0xMTkuNjIgMjgwLjk5LC0xMTkuNjIiLz4KPC9nPgo8IS0tIGNoYWluc3luY2VyJiM0NTsmZ3Q7ZXRoX21vbml0b3IgLS0+CjxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWluc3luY2VyJiM0NTsmZ3Q7ZXRoX21vbml0b3I8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzE0LjQ5LC0xNDguNDlDMzQ3LjgzLC0xMzcuMjEgMzk3LjE0LC0xMjAuNTQgNDM0LjA3LC0xMDguMDUiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDM0Ljg0LC0xMTEuNDggNDQzLjE5LC0xMDQuOTcgNDMyLjU5LC0xMDQuODUgNDM0Ljg0LC0xMTEuNDgiLz4KPC9nPgo8IS0tIGNoYWlucXVldWUmIzQ1OyZndDtjaGFpbmQgLS0+CjxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWlucXVldWUmIzQ1OyZndDtjaGFpbmQ8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMTcyLjM3LC0xNDYuMzNDMTkyLjI3LC0xMzUuODUgMjE5LjIzLC0xMjEuNjYgMjQwLjg2LC0xMTAuMjgiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iMjQyLjQ0LC0xMTMuNCAyNDkuNjYsLTEwNS42NCAyMzkuMTgsLTEwNy4yIDI0Mi40NCwtMTEzLjQiLz4KPC9nPgo8IS0tIGNoYWluZCYjNDU7Jmd0O2NoYWluZF9ldGggLS0+CjxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KPHRpdGxlPmNoYWluZCYjNDU7Jmd0O2NoYWluZF9ldGg8L3RpdGxlPgo8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBkPSJNMzEwLjI5LC03Ny4yOEMzNDEuOCwtNjYuMDMgMzg5Ljc1LC00OC45IDQyNS41NCwtMzYuMTIiLz4KPHBvbHlnb24gZmlsbD0iYmxhY2siIHN0cm9rZT0iYmxhY2siIHBvaW50cz0iNDI2LjU1LC0zOS40OCA0MzQuNzksLTMyLjgyIDQyNC4yLC0zMi44OSA0MjYuNTUsLTM5LjQ4Ii8+CjwvZz4KPC9nPgo8L3N2Zz4K" />
     71 
     72 The dependency graph is only available in as an unformatted **graphviz** document located at `$REPO_ROOT/deps.dot`. `make diagram` renders this SVG version.
     73 
     74 
     75 ### Man pages
     76 
     77 The `chainlib` module provides the script `chainlib-man.py` which provides an inheritance approach to generate man pages for CLI tools that build on the library.
     78 
     79 An immediate example can be found in the `chainlib-eth` repository, where the directory `$REPO_ROOT/man` demonstrates how to add hooks for overriding both section contents and argument options for individual tools.
     80 
     81 What override behavior is currently available should be straightforward to glean from reading the `$CHAINLIB_REPO_ROOT/scripts/chainlib-man.py` script.
     82 
     83 Invoking `make man` in the `chainlib-eth` and `eth-monitor` repositories will trigger a build of man pages for all the CLI tools provided.
     84 
     85 
     86 ### Descriptive documentation
     87 
     88 Some initial work for high-level documentation exists in the chainlib repository, specifically in `$REPO_ROOT/doc/texinfo`.
     89 
     90 The documentation can be generated by running `make doc` in the `$REPO_ROOT` of **this** repository. The HTML version of the documentation will be output as a single file to `$REPO_ROOT/build/out/index.html`
     91 
     92 
     93 ### Docstrings
     94 
     95 Not much to add here. Ye generic sphinx-doc invocation should do the trick.
     96 
     97 
     98 ## High-level implementations
     99 
    100 To compensate somewhat for the lack of exhaustive documentation, actual implementations using the library may help light the way somewhat.
    101 
    102 Aside from the "higher level" components listed above, two known EVM-based implementations that have some minimum level of maturity are:
    103 
    104 * [eth-erc20](https://git.defalsify.org/eth-erc20) - an implementation of the ERC20 token, which also includes an example token contract that lets authorized addresses arbitrarily mint tokens at any time.
    105 * [eth-erc721](https://git.defalsify.org/eth-erc721) - an implementation of the ERC721 "NFT" token, which also includes an example token contract that creates achievment badges for developed contributions.
    106 
    107 
    108 ## Known issues
    109 
    110 The requirements for testing (`test_requirements.txt`) under each repository include dependencies that use rust components which use unstable features.
    111 
    112 The authors have used a "nightly" toolchain provided by the [rustup](https://rustup.rs/) tool to build test requirements. However, this is failing with newer versions of the rust toolchain.
    113 
    114 The authors report having successfully built with the `nightly-2022-11-14` toolchain. Hopefully this will work for others aswell.
    115 
    116 If any other toolchain is succesfully used, please report this and/or submit a git diff of this documentation including the most recent compatible toolchain to: [chaintool@defalsify.org](mailto:chaintool@defalsify.org).
    117