sequencer posts blocks to bedrock

This commit is contained in:
Sergio Chouhy 2026-01-13 16:53:00 -03:00
parent 72a3e406b8
commit ccce2213da
14 changed files with 502 additions and 48 deletions

332
Cargo.lock generated
View File

@ -367,6 +367,15 @@ version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "archery"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d"
dependencies = [
"triomphe",
]
[[package]]
name = "ark-bls12-381"
version = "0.4.0"
@ -948,6 +957,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"common-http-client",
"key-management-system-service",
"reqwest",
]
@ -1098,7 +1108,7 @@ dependencies = [
[[package]]
name = "broadcast-service"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"derivative",
@ -1267,6 +1277,35 @@ dependencies = [
"cpufeatures",
]
[[package]]
name = "chain-service"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"broadcast-service",
"bytes",
"cryptarchia-engine",
"cryptarchia-sync",
"futures",
"groth16",
"nomos-core",
"nomos-ledger",
"nomos-network",
"nomos-storage",
"nomos-utils",
"num-bigint",
"overwatch",
"serde",
"serde_with",
"services-utils",
"strum",
"thiserror 1.0.69",
"tokio",
"tracing",
"tracing-futures",
]
[[package]]
name = "chrono"
version = "0.4.42"
@ -1294,7 +1333,7 @@ dependencies = [
[[package]]
name = "circuits-prover"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"circuits-utils",
"tempfile",
@ -1303,7 +1342,7 @@ dependencies = [
[[package]]
name = "circuits-utils"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"dirs",
]
@ -1395,9 +1434,10 @@ dependencies = [
[[package]]
name = "common-http-client"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"broadcast-service",
"chain-service",
"futures",
"nomos-core",
"nomos-da-messages",
@ -1452,6 +1492,15 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
[[package]]
name = "convert_case"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "convert_case"
version = "0.10.0"
@ -1530,7 +1579,7 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
[[package]]
name = "cryptarchia-engine"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"cfg_eval",
"nomos-utils",
@ -1541,6 +1590,23 @@ dependencies = [
"tracing",
]
[[package]]
name = "cryptarchia-sync"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"bytes",
"cryptarchia-engine",
"futures",
"nomos-core",
"rand 0.8.5",
"serde",
"serde_with",
"thiserror 1.0.69",
"tokio",
"tracing",
]
[[package]]
name = "crypto-bigint"
version = "0.5.5"
@ -1707,7 +1773,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976"
dependencies = [
"data-encoding",
"syn 1.0.109",
"syn 2.0.111",
]
[[package]]
@ -2344,7 +2410,7 @@ dependencies = [
[[package]]
name = "groth16"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ark-bn254 0.4.0",
"ark-ec 0.4.2",
@ -2653,7 +2719,7 @@ dependencies = [
"libc",
"percent-encoding",
"pin-project-lite",
"socket2 0.6.1",
"socket2 0.5.10",
"system-configuration",
"tokio",
"tower-service",
@ -3015,7 +3081,7 @@ dependencies = [
[[package]]
name = "key-management-system-keys"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"bytes",
@ -3040,13 +3106,28 @@ dependencies = [
[[package]]
name = "key-management-system-macros"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]]
name = "key-management-system-service"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"key-management-system-keys",
"log",
"overwatch",
"serde",
"thiserror 2.0.17",
"tokio",
"tracing",
]
[[package]]
name = "key_protocol"
version = "0.1.0"
@ -3071,7 +3152,7 @@ dependencies = [
[[package]]
name = "kzgrs"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ark-bls12-381",
"ark-ec 0.4.2",
@ -3090,7 +3171,7 @@ dependencies = [
[[package]]
name = "kzgrs-backend"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ark-ff 0.4.2",
"ark-poly 0.4.2",
@ -3172,6 +3253,7 @@ dependencies = [
"bs58",
"hkdf",
"multihash",
"serde",
"sha2",
"thiserror 2.0.17",
"tracing",
@ -3374,6 +3456,18 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "mmr"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ark-ff 0.4.2",
"groth16",
"poseidon2",
"rpds",
"serde",
]
[[package]]
name = "multiaddr"
version = "0.18.2"
@ -3483,7 +3577,7 @@ dependencies = [
[[package]]
name = "nomos-blend-crypto"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"blake2",
"groth16",
@ -3498,10 +3592,32 @@ dependencies = [
"zeroize",
]
[[package]]
name = "nomos-blend-message"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"blake2",
"derivative",
"groth16",
"itertools 0.14.0",
"key-management-system-keys",
"nomos-blend-crypto",
"nomos-blend-proofs",
"nomos-core",
"nomos-utils",
"serde",
"serde-big-array",
"serde_with",
"thiserror 1.0.69",
"tracing",
"zeroize",
]
[[package]]
name = "nomos-blend-proofs"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ed25519-dalek",
"generic-array 1.3.5",
@ -3516,7 +3632,7 @@ dependencies = [
[[package]]
name = "nomos-core"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ark-ff 0.4.2",
"async-trait",
@ -3546,7 +3662,7 @@ dependencies = [
[[package]]
name = "nomos-da-messages"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"blake2",
"futures",
@ -3559,7 +3675,7 @@ dependencies = [
[[package]]
name = "nomos-http-api-common"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"axum",
"governor",
@ -3571,10 +3687,68 @@ dependencies = [
"tower_governor",
]
[[package]]
name = "nomos-ledger"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"cryptarchia-engine",
"groth16",
"key-management-system-keys",
"mmr",
"nomos-blend-crypto",
"nomos-blend-message",
"nomos-blend-proofs",
"nomos-core",
"nomos-utils",
"num-bigint",
"rand 0.8.5",
"rpds",
"serde",
"thiserror 1.0.69",
"tracing",
"utxotree",
]
[[package]]
name = "nomos-network"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"cryptarchia-sync",
"futures",
"nomos-core",
"overwatch",
"serde",
"tokio",
"tokio-stream",
"tracing",
]
[[package]]
name = "nomos-storage"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"bytes",
"cryptarchia-engine",
"futures",
"libp2p-identity",
"multiaddr",
"nomos-core",
"overwatch",
"serde",
"thiserror 1.0.69",
"tokio",
"tracing",
]
[[package]]
name = "nomos-utils"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"blake2",
@ -3826,6 +4000,7 @@ source = "git+https://github.com/logos-co/Overwatch?rev=f5a9902#f5a99022f389d65a
dependencies = [
"async-trait",
"futures",
"overwatch-derive",
"thiserror 2.0.17",
"tokio",
"tokio-stream",
@ -3833,6 +4008,18 @@ dependencies = [
"tracing",
]
[[package]]
name = "overwatch-derive"
version = "0.1.0"
source = "git+https://github.com/logos-co/Overwatch?rev=f5a9902#f5a99022f389d65adbd55e51f1e3f9eead62432a"
dependencies = [
"convert_case 0.8.0",
"proc-macro-error2",
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]]
name = "parking_lot"
version = "0.12.5"
@ -3939,7 +4126,7 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "pol"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"circuits-prover",
"circuits-utils",
@ -3967,7 +4154,7 @@ dependencies = [
[[package]]
name = "poq"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"circuits-prover",
"circuits-utils",
@ -3989,7 +4176,7 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
[[package]]
name = "poseidon2"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ark-bn254 0.4.0",
"ark-ff 0.4.2",
@ -4042,6 +4229,28 @@ dependencies = [
"toml_edit 0.23.10+spec-1.0.0",
]
[[package]]
name = "proc-macro-error-attr2"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
dependencies = [
"proc-macro2",
"quote",
]
[[package]]
name = "proc-macro-error2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
dependencies = [
"proc-macro-error-attr2",
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]]
name = "proc-macro2"
version = "1.0.103"
@ -4155,7 +4364,7 @@ dependencies = [
"quinn-udp",
"rustc-hash",
"rustls",
"socket2 0.6.1",
"socket2 0.5.10",
"thiserror 2.0.17",
"tokio",
"tracing",
@ -4192,7 +4401,7 @@ dependencies = [
"cfg_aliases",
"libc",
"once_cell",
"socket2 0.6.1",
"socket2 0.5.10",
"tracing",
"windows-sys 0.60.2",
]
@ -4660,6 +4869,16 @@ dependencies = [
"librocksdb-sys",
]
[[package]]
name = "rpds"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e75f485e819d4d3015e6c0d55d02a4fd3db47c1993d9e603e0361fba2bffb34"
dependencies = [
"archery",
"serde",
]
[[package]]
name = "rrs-lib"
version = "0.1.0"
@ -4938,18 +5157,25 @@ version = "0.1.0"
dependencies = [
"anyhow",
"base58",
"bedrock_client",
"borsh",
"chrono",
"common",
"futures",
"key-management-system-service",
"log",
"mempool",
"nomos-core",
"nssa",
"nssa_core",
"rand 0.8.5",
"reqwest",
"serde",
"serde_json",
"storage",
"tempfile",
"tokio",
"zksign",
]
[[package]]
@ -4990,6 +5216,7 @@ dependencies = [
"sequencer_core",
"sequencer_rpc",
"tokio",
"zksign",
]
[[package]]
@ -5002,6 +5229,15 @@ dependencies = [
"serde_derive",
]
[[package]]
name = "serde-big-array"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f"
dependencies = [
"serde",
]
[[package]]
name = "serde_core"
version = "1.0.228"
@ -5108,6 +5344,21 @@ dependencies = [
"serde",
]
[[package]]
name = "services-utils"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"async-trait",
"futures",
"log",
"overwatch",
"serde",
"serde_json",
"thiserror 1.0.69",
"tracing",
]
[[package]]
name = "sha1"
version = "0.10.6"
@ -5751,6 +6002,16 @@ dependencies = [
"valuable",
]
[[package]]
name = "tracing-futures"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
dependencies = [
"pin-project",
"tracing",
]
[[package]]
name = "tracing-subscriber"
version = "0.2.25"
@ -5760,6 +6021,12 @@ dependencies = [
"tracing-core",
]
[[package]]
name = "triomphe"
version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39"
[[package]]
name = "try-lock"
version = "0.2.5"
@ -5863,6 +6130,21 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "utxotree"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"ark-ff 0.4.2",
"groth16",
"nomos-core",
"num-bigint",
"poseidon2",
"rpds",
"serde",
"thiserror 1.0.69",
]
[[package]]
name = "valuable"
version = "0.1.1"
@ -6310,7 +6592,7 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
[[package]]
name = "witness-generator"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"circuits-utils",
"tempfile",
@ -6465,7 +6747,7 @@ dependencies = [
[[package]]
name = "zksign"
version = "0.1.0"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git?branch=feat-skip-zk-build#fde542bb8398189fe5e9bad688a527618261f63d"
source = "git+https://github.com/logos-blockchain/logos-blockchain.git#b89238be3ad8111b9975e1023b87d8672d0edd74"
dependencies = [
"circuits-prover",
"circuits-utils",

View File

@ -34,6 +34,7 @@ sequencer_rpc = { path = "sequencer_rpc" }
sequencer_runner = { path = "sequencer_runner" }
wallet = { path = "wallet" }
test_program_methods = { path = "test_program_methods" }
bedrock_client = { path = "bedrock_client" }
tokio = { version = "1.28.2", features = [
"net",
@ -78,7 +79,9 @@ base58 = "0.2.0"
itertools = "0.14.0"
url = "2.5.4"
common-http-client = { git = "https://github.com/logos-blockchain/logos-blockchain.git", branch = "feat-skip-zk-build" }
common-http-client = { git = "https://github.com/logos-blockchain/logos-blockchain.git" }
key-management-system-service = { git = "https://github.com/logos-blockchain/logos-blockchain.git" }
nomos-core = { git = "https://github.com/logos-blockchain/logos-blockchain.git" }
rocksdb = { version = "0.24.0", default-features = false, features = [
"snappy",

View File

@ -7,3 +7,4 @@ edition = "2024"
reqwest.workspace = true
anyhow.workspace = true
common-http-client.workspace = true
key-management-system-service.workspace = true

View File

@ -43,7 +43,7 @@ pub struct Block {
pub body: BlockBody,
}
#[derive(Debug, PartialEq, Eq, BorshSerialize, BorshDeserialize)]
#[derive(Debug, Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)]
pub struct HashableBlockData {
pub block_id: BlockId,
pub prev_block_hash: BlockHash,

View File

@ -154,5 +154,7 @@
37,
37,
37
]
}
],
"bedrock_channel_id": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
"bedrock_node_url": "http://localhost:18080"
}

View File

@ -185,6 +185,7 @@ impl TpsTestManager {
initial_accounts: initial_public_accounts,
initial_commitments: vec![initial_commitment],
signing_key: [37; 32],
bedrock_config: None
}
}
}

View File

@ -17,6 +17,13 @@ serde_json.workspace = true
tempfile.workspace = true
chrono.workspace = true
log.workspace = true
bedrock_client.workspace = true
key-management-system-service = { git = "https://github.com/logos-blockchain/logos-blockchain.git" }
nomos-core = { git = "https://github.com/logos-blockchain/logos-blockchain.git" }
zksign = { git = "https://github.com/logos-blockchain/logos-blockchain.git", default-features = false }
rand.workspace = true
reqwest.workspace = true
borsh.workspace = true
[features]
default = []

View File

@ -0,0 +1,118 @@
use std::{fs, path::Path};
use anyhow::Result;
use bedrock_client::BedrockClient;
use common::block::HashableBlockData;
use key_management_system_service::keys::{ED25519_SECRET_KEY_SIZE, Ed25519Key, Ed25519PublicKey};
use nomos_core::mantle::{
MantleTx, Op, OpProof, SignedMantleTx, Transaction, TxHash, ledger,
ops::channel::{ChannelId, MsgId, inscribe::InscriptionOp},
};
use reqwest::Url;
use crate::config::BedrockConfig;
pub struct BlockSettlementClient {
bedrock_node_url: Url,
bedrock_client: BedrockClient,
bedrock_signing_key: Ed25519Key,
bedrock_channel_id: ChannelId,
}
impl BlockSettlementClient {
pub fn new(home: &Path, config: &BedrockConfig) -> Self {
let bedrock_signing_key =
load_or_create_signing_key(&home.join("bedrock_signing_key")).unwrap();
let bedrock_node_url = Url::parse(&config.node_url).unwrap();
let bedrock_channel_id = ChannelId::from(config.channel_id);
let bedrock_client =
BedrockClient::new(None).expect("Bedrock client should be able to initialize");
Self {
bedrock_node_url,
bedrock_client,
bedrock_signing_key,
bedrock_channel_id,
}
}
/// Create and sign a transaction for inscribing data
pub fn create_inscribe_tx(&self, data: Vec<u8>, parent: MsgId) -> SignedMantleTx {
let verifying_key_bytes = self.bedrock_signing_key.public_key().to_bytes();
let verifying_key =
Ed25519PublicKey::from_bytes(&verifying_key_bytes).expect("valid ed25519 public key");
let inscribe_op = InscriptionOp {
channel_id: self.bedrock_channel_id,
inscription: data,
parent,
signer: verifying_key,
};
let ledger_tx = ledger::Tx::new(vec![], vec![]);
let inscribe_tx = MantleTx {
ops: vec![Op::ChannelInscribe(inscribe_op)],
ledger_tx,
storage_gas_price: 0,
execution_gas_price: 0,
};
let tx_hash = inscribe_tx.hash();
let signature_bytes = self
.bedrock_signing_key
.sign_payload(tx_hash.as_signing_bytes().as_ref())
.to_bytes();
let signature =
key_management_system_service::keys::Ed25519Signature::from_bytes(&signature_bytes);
SignedMantleTx {
ops_proofs: vec![OpProof::Ed25519Sig(signature)],
ledger_tx_proof: empty_ledger_signature(&tx_hash),
mantle_tx: inscribe_tx,
}
}
/// Post a transaction to the node and wait for inclusion
pub async fn post_and_wait(&self, block_data: &HashableBlockData) -> Result<u64> {
let msg_id: MsgId = {
let mut this = [0; 32];
this[0..8].copy_from_slice(&block_data.block_id.to_le_bytes());
this.into()
};
let inscription_data = borsh::to_vec(&block_data)?;
let tx = self.create_inscribe_tx(inscription_data, msg_id);
// Post the transaction
self.bedrock_client
.0
.post_transaction(self.bedrock_node_url.clone(), tx.clone())
.await?;
Ok(block_data.block_id)
}
}
/// Load signing key from file or generate a new one if it doesn't exist
fn load_or_create_signing_key(path: &Path) -> Result<Ed25519Key, ()> {
if path.exists() {
let key_bytes = fs::read(path).map_err(|_| ())?;
if key_bytes.len() != ED25519_SECRET_KEY_SIZE {
// TODO: proper error
return Err(());
}
let key_array: [u8; ED25519_SECRET_KEY_SIZE] =
key_bytes.try_into().expect("length already checked");
Ok(Ed25519Key::from_bytes(&key_array))
} else {
let mut key_bytes = [0u8; ED25519_SECRET_KEY_SIZE];
rand::RngCore::fill_bytes(&mut rand::thread_rng(), &mut key_bytes);
fs::write(path, key_bytes).map_err(|_| ())?;
Ok(Ed25519Key::from_bytes(&key_bytes))
}
}
fn empty_ledger_signature(tx_hash: &TxHash) -> key_management_system_service::keys::ZkSignature {
key_management_system_service::keys::ZkKey::multi_sign(&[], tx_hash.as_ref())
.expect("multi-sign with empty key set works")
}

View File

@ -47,6 +47,16 @@ pub struct SequencerConfig {
pub initial_commitments: Vec<CommitmentsInitialData>,
/// Sequencer own signing key
pub signing_key: [u8; 32],
/// Bedrock configuration options
pub bedrock_config: Option<BedrockConfig>,
}
#[derive(Clone, Serialize, Deserialize)]
pub struct BedrockConfig {
/// Bedrock channel ID
pub channel_id: [u8; 32],
/// Bedrock Url
pub node_url: String,
}
impl SequencerConfig {

View File

@ -13,8 +13,9 @@ use log::warn;
use mempool::{MemPool, MemPoolHandle};
use serde::{Deserialize, Serialize};
use crate::block_store::SequencerBlockStore;
use crate::{block_settlement_client::BlockSettlementClient, block_store::SequencerBlockStore};
mod block_settlement_client;
pub mod block_store;
pub mod config;
@ -24,6 +25,7 @@ pub struct SequencerCore {
mempool: MemPool<EncodedTransaction>,
sequencer_config: SequencerConfig,
chain_height: u64,
block_settlement_client: Option<BlockSettlementClient>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
@ -87,12 +89,18 @@ impl SequencerCore {
state.add_pinata_program(PINATA_BASE58.parse().unwrap());
let (mempool, mempool_handle) = MemPool::new(config.mempool_max_size);
let block_settlement = config
.bedrock_config
.as_ref()
.map(|bedrock_config| BlockSettlementClient::new(&config.home, bedrock_config));
let mut this = Self {
state,
block_store,
mempool,
chain_height: config.genesis_id,
sequencer_config: config,
block_settlement_client: block_settlement,
};
this.sync_state_with_stored_blocks();
@ -137,9 +145,21 @@ impl SequencerCore {
Ok(tx)
}
pub async fn produce_new_block_and_post_to_settlement_layer(&mut self) -> Result<u64> {
let block_data = self.produce_new_block_with_mempool_transactions()?;
if let Some(block_settlement) = &self.block_settlement_client {
block_settlement.post_and_wait(&block_data).await?;
log::info!("Posted block data to Bedrock");
}
Ok(self.chain_height)
}
/// Produces new block from transactions in mempool
pub fn produce_new_block_with_mempool_transactions(&mut self) -> Result<u64> {
pub fn produce_new_block_with_mempool_transactions(&mut self) -> Result<HashableBlockData> {
let now = Instant::now();
let new_block_height = self.chain_height + 1;
let mut valid_transactions = vec![];
@ -167,8 +187,6 @@ impl SequencerCore {
let curr_time = chrono::Utc::now().timestamp_millis() as u64;
let num_txs_in_block = valid_transactions.len();
let hashable_data = HashableBlockData {
block_id: new_block_height,
transactions: valid_transactions,
@ -176,14 +194,16 @@ impl SequencerCore {
timestamp: curr_time,
};
let block = hashable_data.into_block(self.block_store.signing_key());
let block = hashable_data
.clone()
.into_block(self.block_store.signing_key());
self.block_store.put_block_at_id(block)?;
self.chain_height = new_block_height;
// TODO: Consider switching to `tracing` crate to have more structured and consistent logs
// e.g.
// // e.g.
//
// ```
// info!(
@ -194,11 +214,10 @@ impl SequencerCore {
// ```
log::info!(
"Created block with {} transactions in {} seconds",
num_txs_in_block,
hashable_data.transactions.len(),
now.elapsed().as_secs()
);
Ok(self.chain_height)
Ok(hashable_data)
}
pub fn state(&self) -> &nssa::V02State {
@ -277,6 +296,7 @@ mod tests {
initial_accounts,
initial_commitments: vec![],
signing_key: *sequencer_sign_key_for_testing().value(),
bedrock_config: None,
}
}
@ -619,9 +639,9 @@ mod tests {
let tx = common::test_utils::produce_dummy_empty_transaction();
mempool_handle.push(tx).await.unwrap();
let block_id = sequencer.produce_new_block_with_mempool_transactions();
assert!(block_id.is_ok());
assert_eq!(block_id.unwrap(), genesis_height + 1);
let block = sequencer.produce_new_block_with_mempool_transactions();
assert!(block.is_ok());
assert_eq!(block.unwrap().block_id, genesis_height + 1);
}
#[tokio::test]
@ -658,7 +678,8 @@ mod tests {
// Create block
let current_height = sequencer
.produce_new_block_with_mempool_transactions()
.unwrap();
.unwrap()
.block_id;
let block = sequencer
.block_store
.get_block_at_id(current_height)
@ -697,7 +718,8 @@ mod tests {
mempool_handle.push(tx.clone()).await.unwrap();
let current_height = sequencer
.produce_new_block_with_mempool_transactions()
.unwrap();
.unwrap()
.block_id;
let block = sequencer
.block_store
.get_block_at_id(current_height)
@ -708,7 +730,8 @@ mod tests {
mempool_handle.push(tx.clone()).await.unwrap();
let current_height = sequencer
.produce_new_block_with_mempool_transactions()
.unwrap();
.unwrap()
.block_id;
let block = sequencer
.block_store
.get_block_at_id(current_height)
@ -743,7 +766,8 @@ mod tests {
mempool_handle.push(tx.clone()).await.unwrap();
let current_height = sequencer
.produce_new_block_with_mempool_transactions()
.unwrap();
.unwrap()
.block_id;
let block = sequencer
.block_store
.get_block_at_id(current_height)

View File

@ -388,6 +388,7 @@ mod tests {
initial_accounts,
initial_commitments: vec![],
signing_key: *sequencer_sign_key_for_testing().value(),
bedrock_config: None,
}
}

View File

@ -9,6 +9,7 @@ sequencer_core = { workspace = true, features = ["testnet"] }
sequencer_rpc.workspace = true
clap = { workspace = true, features = ["derive", "env"] }
zksign = { git = "https://github.com/logos-blockchain/logos-blockchain.git", default-features = false }
anyhow.workspace = true
env_logger.workspace = true
log.workspace = true

View File

@ -154,5 +154,9 @@
37,
37,
37
]
}
],
"bedrock_config": {
"channel_id": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
"node_url": "http://localhost:34485"
}
}

View File

@ -50,7 +50,7 @@ pub async fn startup_sequencer(
let id = {
let mut state = seq_core_wrapped.lock().await;
state.produce_new_block_with_mempool_transactions()?
state.produce_new_block_and_post_to_settlement_layer().await?
};
info!("Block with id {id} created");