# chainlib

Chainlib is a prototype attempt at writing a generalized code library structure in python3 for concepts that are valid across blockchains, either within the same chain technology or across them. If useful and/or successful, it should be considered ported to a more performant language (rust?).

It is primarily aimed at (possibly threaded) console-environment development.

It aims to give fine-grained control and transparency to all operations and transformations. 

It library code should be easy to understand and maintain.

To achieve transparency and improve maintainability, it deliberately exposes the _user_ of this code to a certain degree of complexity.

Ultimately, the chainlib library is for the developer who seeks to understand and contribute, rather than merely defer and consume.


## Requirements

Chainlib seeks to keep its dependency graph and small as possible. Because of baggage from the initial phase of development, it depends on the `crypto-dev-signer` library to represent transaction structures. As this dependency also includes other routines not necessary for the code in the library, it will be replaced with a dedicated component. `crypto-dev-signer` will still be used as default for tests, and for the time being also for the CLI runnables.

To generate the bitcoin-style keccak256 hashes, `pysha3` is used. `pysha3` is a very fast python wrapper around the official keccak implementation from [XKCP](https://github.com/XKCP/XKCP).

The other requirements are very this code fragments that merely help to relieve a bit of tedium, and add no magic.

Chainlib is not compatible with python2, nor is there any reason to expect it will aim to be.


## Structure

Any generalizable structures and code can be found in the base module directory `chainlib/`

Currently the only operational code for available targets is for the `evm` and the `Ethereum` network protocol. This code can be found in the separate package `chainlib-eth`.

Every module will have a subdirectory `runnable` which contains CLI convenience tooling for common operations. Any directory `example` will contain code snippets demonstrating usage.


## How to use

There are no (exhaustive) tutorial planned for chainlib. All you need to know should be possible to easily understand from code in the `example` `tests` and `runnable` subfolders.


## See also

* The [chainsyncer](https://gitlab.com/chaintool/chainsyncer) project, which provides a simple chain syncer framework allowing for an arbitrary amount of pluggable code to be executed for each block transaction.
* The [chainqueue](https://gitlab.com/chaintool/chainqueue) project, which provides a transaction queueing daemon that handles conditional submisssion and resubmission of transactions to the network.