pib is a command-line utility for quickly configuring and deploying small Ethereum-style
Proof of Authority blockchains using parity and docker.
Note: This project is experimental and subject to breaking changes. Feel free to get in touch with ideas for features or improvements that would make it more useful for you.
The name pib is a recursive acronym for "Pib Isn't Basil" (basil,
not basil).
pib facilitates a fast design-build-test cycle for purpose-specific blockchain deployments
by managing details such as account-generation, node configuration, and contract deployment.
Say, for example, that we have a contract named FriendsList which expects the constructor
arguments (address owner, address[] friends). An example configuration might look like
this:
[[contract]]
name = "FriendsList"
addr = "0x00000000000000000000000000000000000a11ce"
args = [
"account-addr::alice",
"match-addrs::alice-friend",
]The above configuration tells pib to find and compile the contract named FriendsList, and to deploy
it at the address 0x00000000000000000000000000000000000a11ce with the address of the account
named alice as the first constructor argument, and an array of all addresses tagged with alice-friend
as the second constructor argument.
To get the most out of pib, make sure you have recent versions of docker, docker-compose,
and solc installed. Building pib will also require rustc and cargo (latest stable).
Once you've met the above requirements, run cargo install --path . from the repository root.
You can run pib --help to confirm that the install was successful and see a list of the
available commands.
Run pib new <project-name> to initialize a new project directory with reasonable default options:
$ pib new my-project
$ cd my-project
$ tree
.
├── config
│ ├── contracts
│ │ └── EchoContract.sol
│ └── templates
│ ├── authority-config.toml
│ ├── chain.json
│ ├── Dockerfile
│ ├── init.sh
│ └── interface-config.toml
├── include
│ └── example
│ └── include.md
└── pib.toml
5 directories, 8 files
The only required file is the pib.toml which describes the core project configuration. By default,
the new subcommand creates examples which demonstrate usage of basic features like contract
deployment and file replication. This behavior can be disabled with the --no-examples flag.
The config/contracts directory contains contract source-code which is used to build contracts
specified in the pib.toml. If no contracts are specified in pib.toml, then the config/contracts
directory may be safely omitted. The above example includes one deployment of EchoContract,
specified within the pib.toml like so:
[[contract]]
name = "EchoContract"
addr = "0x0000000000000000000000000000000000003c40"
args = []
tags = []By default, pib will invoke solc to compile contracts. If you would prefer to use a pre-compiled
contract, place the binary at config/contracts/<contract-name>.bin and use the --no-solc
flag when building your project.
The default values of various files generated by pib may be overridden by changing the contents
of config/templates. The chain.json file, for example, is used by pib as the basis for
generating a chain specification. This file can be
modified to supply custom values for more advanced configuration options such as the genesis
gasLimit, or a custom networkID.
The include directory allows the user to replicate arbitrary files to one or more nodes.
The include/example directory contains a single file, include.md, which can be replicated
to one or more nodes via the include parameter. Ex:
# ...
include = ["example/:include-example/"]Paths ending in / are treated as directories to be recursively copied, and paths not ending
in / are treated as individual files. Arguments may be a single path with no : if the
desired destination is the same as the source (e.g. foo/bar.txt:foo/bar.txt may simply
be written as foo/bar.txt).
Projects may be built with the build subcommand, and launched with docker-compose:
$ pib build
...
$ cd output
$ sudo docker-compose up --build
...
Current iteration:
- Separate setup and build processes into context object and module trait
- Export cli option structs from main crate
- Finish implementing arbitrary (and recursive)
includearguments - Clarify
ConfigModule's operational contract- Practical to require idempotence?
- Support "export" operations for
internalentities- Should
exportinclude contracts/templates/etc?
- Should
- Add config module for network topology contract
- Add config module for parity Secret Store functionality
- Add
dry-runcli option for builds- Mostly useful for ensuring that all
ConfigModuleops succeed
- Mostly useful for ensuring that all
- Raise error on duplicates for named entities (e.g. nodes)
- Raise error on duplicate file insertions
- Build/rebuild contracts by default (add cli option to override)
- Add cli option to export contract ABIs
- Allow toggling of active modules from command-line
- Use
temfile::TempDirfor contract compilation & tests - Improve node IP address handling
- Non-empty list instead of one-to-one?
- One primary and zero or more alternate?