README for cardano-clusterlib
Python wrapper for cardano-cli for working with cardano cluster. It supports all cardano-cli commands (except parts of genesis
and governance
).
The library is used for development of cardano-node system tests.
Installation
$ python3 -m venv .env
$ . .env/bin/activate
$ pip install cardano-clusterlib
$ make install
Usage
The library needs working cardano-cli
(the command is available on PATH
, cardano-node
is running, CARDANO_NODE_SOCKET_PATH
is set). In state_dir
it expects "shelley/genesis.json".
cluster = clusterlib.ClusterLib(state_dir="path/to/cluster/state_dir")
On custom testnets that were started in Byron era, you might need to specify a slots offset between Byron epochs and Shelley epochs.
The "slots_offset" is a difference between number of slots in Byron epochs and in the same number of Shelley epochs.
E.g. for a testnet with parameters
- 100 slots per epoch in Byron era
- 1000 slots per epoch in Shelley era
- two epochs in Byron era before forking to Shelley
The offset will be 2 * (1000 - 100) = 1800
.
cluster = clusterlib.ClusterLib(state_dir="path/to/cluster/state_dir", slots_offset=1800)
Transfer funds
from cardano_clusterlib import clusterlib
cluster = clusterlib.ClusterLib(state_dir="path/to/cluster/state_dir")
src_address = "addr_test1vpst87uzwafqkxumyf446zr2jsyn44cfpu9fe8yqanyuh6glj2hkl"
src_skey_file = "/path/to/skey"
dst_addr = cluster.g_address.gen_payment_addr_and_keys(name="destination_address")
amount_lovelace = 10_000_000
txouts = [clusterlib.TxOut(address=dst_addr.address, amount=amount_lovelace)]
tx_files = clusterlib.TxFiles(signing_key_files=[src_skey_file])
tx_raw_output = cluster.g_transaction.send_tx(
src_address=src_address,
tx_name="send_funds",
txouts=txouts,
tx_files=tx_files,
)
cluster.g_query.get_utxo(dst_addr.address)
Lock and redeem funds with Plutus script
from cardano_clusterlib import clusterlib
cluster = clusterlib.ClusterLib(state_dir="path/to/cluster/state_dir", tx_era="babbage")
src_address = "addr_test1vpst87uzwafqkxumyf446zr2jsyn44cfpu9fe8yqanyuh6glj2hkl"
src_skey_file = "/path/to/skey"
dst_addr = cluster.g_address.gen_payment_addr_and_keys(name="destination_address")
amount_fund = 10_000_000
amount_redeem = 5_000_000
script_address = cluster.g_address.gen_payment_addr(
addr_name="script_address", payment_script_file="path/to/script.plutus"
)
tx_files_fund = clusterlib.TxFiles(signing_key_files=[src_skey_file])
datum_hash = cluster.g_transaction.get_hash_script_data(script_data_file="path/to/file.datum")
txouts_fund = [
clusterlib.TxOut(address=script_address, amount=amount_fund, datum_hash=datum_hash),
clusterlib.TxOut(address=dst_addr.address, amount=2_000_000),
]
tx_output_fund = cluster.g_transaction.build_tx(
src_address=src_address,
tx_name="fund_script_address",
tx_files=tx_files_fund,
txouts=txouts_fund,
fee_buffer=2_000_000,
)
tx_signed_fund = cluster.g_transaction.sign_tx(
tx_body_file=tx_output_fund.out_file,
signing_key_files=tx_files_fund.signing_key_files,
tx_name="fund_script_address",
)
cluster.g_transaction.submit_tx(tx_file=tx_signed_fund, txins=tx_output_fund.txins)
fund_utxos = cluster.g_query.get_utxo(tx_raw_output=tx_output_fund)
script_utxos = clusterlib.filter_utxos(utxos=fund_utxos, address=script_address)
collateral_utxos = clusterlib.filter_utxos(utxos=fund_utxos, address=dst_addr.address)
plutus_txins = [
clusterlib.ScriptTxIn(
txins=script_utxos,
script_file="path/to/script.plutus",
collaterals=collateral_utxos,
datum_file="path/to/file.datum",
redeemer_file="path/to/file.redeemer",
)
]
tx_files_redeem = clusterlib.TxFiles(signing_key_files=[dst_addr.skey_file])
txouts_redeem = [
clusterlib.TxOut(address=dst_addr.address, amount=amount_redeem),
]
tx_output_redeem = cluster.g_transaction.build_tx(
src_address=src_address,
tx_name="redeem_funds",
tx_files=tx_files_redeem,
txouts=txouts_redeem,
script_txins=plutus_txins,
change_address=dst_addr.address,
)
tx_signed_redeem = cluster.g_transaction.sign_tx(
tx_body_file=tx_output_redeem.out_file,
signing_key_files=tx_files_redeem.signing_key_files,
tx_name="redeem_funds",
)
cluster.g_transaction.submit_tx(tx_file=tx_signed_redeem, txins=tx_output_fund.txins)
More examples
See cardano-node-tests for more examples, e.g. minting new tokens or minting new tokens with Plutus
Source Documentation
https://cardano-clusterlib-py.readthedocs.io/en/latest/cardano_clusterlib.html
Contributing
Install this package and its dependencies as described above.
Run pre-commit install
to set up the git hook scripts that will check you changes before every commit. Alternatively run make lint
manually before pushing your changes.
Follow the Google Python Style Guide, with the exception that formatting is handled automatically by Black (through pre-commit
command).