Loki
Loki is an adversary node implementation and api which operates on jormungandr network.
Build & Install
In order to build hersir in main project folder run:
cd testing/loki
cargo build
cargo install --path . --force
Quick Start
Loki can be used bootstrap using cli:
loki --genesis-block block0.bin --listen-address 127.0.0.1:8080 -s secret.yaml
where:
genesis-block
- Path to the genesis block (the block0) of the blockchain
listen-address
- Specifies the address the node will listen
secret
- Set the secret node config (in YAML format). Example:
---
bft:
signing_key: ed25519_sk1w2tyr7e2w26w5vxv65xf36kpvcsach8rcdmlmrhg3rjzeumjnzyqvdvwfa
Then utilizing rest interface of loki node one can send some invalid GRPC messages to rest of the network:
curl --location --request POST 'http://127.0.0.1:8080/invalid_fragment' \
--header 'Content-Type: application/json' \
--data-raw '{
"address": "127.0.0.1:1000",
"parent": "tip"
}'
where:
address
- address of “victim” node,
parent
- Parent block. Possible values:
tip
- current tip of “victim” node,block0
- block0,{Hash}
- arbitrary parent block which hash is provided in request
Other possible operations
/invalid_hash
- Sends block with invalid hash,/invalid_signature
- Sends block with invalid by wrong leader signature,/nonexistent_leader
- Sends block with non-existing leader,/wrong_leader
- Sends block with signed with invalid leader,
API
Loki also provides API for performing adversary operations, like sending invalid fragments:
#![allow(unused)] fn main() { use loki::{AdversaryFragmentSender, AdversaryFragmentSenderSetup}; let mut sender = ... let receiver = .. // node initialization let jormungandr = ... let adversary_sender = AdversaryFragmentSender::new( jormungandr.genesis_block_hash(), jormungandr.fees(), BlockDate::first().next_epoch().into(), AdversaryFragmentSenderSetup::no_verify(), ); adversary_sender .send_faulty_transactions_with_iteration_delay( 10, &mut sender, &receiver, &jormungandr, Duration::from_secs(5), ) .unwrap(); }